Compare commits

..

No commits in common. "master" and "8.3.382" have entirely different histories.

833 changed files with 20818 additions and 42414 deletions

28
.github/workflows/appimage.yml vendored Normal file
View File

@ -0,0 +1,28 @@
on:
push:
tags:
- "*"
name: CI
jobs:
build_appimage:
name: Build AppImage
runs-on: ubuntu-20.04
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Get the version
id: get_version
run: |
export VERSION_NUM=$(ruby -e "print '$GITHUB_REF'.split('/')[2]")
echo ::set-output name=value::${VERSION_NUM}
- name: Build project
run: |
cd appimage
make
cp Magic-x86_64.AppImage /tmp/Magic-${{ steps.get_version.outputs.value }}-x86_64.AppImage
- name: Upload Release Asset
uses: softprops/action-gh-release@v1
with:
files: /tmp/Magic-${{ steps.get_version.outputs.value }}-x86_64.AppImage

View File

@ -1,170 +0,0 @@
on:
push:
tags:
- "*"
workflow_dispatch:
name: CI-appimage10
env:
APPIMAGETOOL_DOWNLOAD_URL: https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage
jobs:
build_appimage10:
name: Build AppImage EL10
runs-on: ubuntu-latest
permissions:
contents: write # action-gh-release
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 149 # enough to cover between tags
#fetch-tags: true # this should work see actions/checkout~issue#1471
- name: Get the version
id: get_version
run: |
git show -s
version=$(cat VERSION) # 8.9.999
version_tstamp=$(git show -s "--format=%cs" | tr -d '-') # YYYYMMDD
version_hash=$(git show -s "--format=%h") # abcdefg
version_num=$(ruby -e "print '$GITHUB_REF'.split('/')[2]") # legacy version method: master
echo "version=${version}"
echo "version_tstamp=${version_tstamp}"
echo "version_hash=${version_hash}"
echo "version_num=${version_num}"
VERSION_NUM="${version}~${version_tstamp}~${version_hash}"
echo "VERSION_NUM=${VERSION_NUM}" >> $GITHUB_ENV
echo "MAGIC_APPIMAGE_OUTPUT_FILENAME=Magic-${VERSION_NUM}-x86_64-EL10.AppImage" >> $GITHUB_ENV
# Is this GHA being run due to a push-on-tag ? if so we make a GitHub release, otherwise we just publish artifact
github_tag=$(echo -n "$GITHUB_REF" | sed -e 's#refs/tags/##') # 8.9.999
echo "github_tag=$github_tag"
if echo -n "$GITHUB_REF" | egrep -q "^refs/tags/" # check prefix
then
if [ -n "$github_tag" ]
then
echo "MY_GITHUB_TAG=${github_tag}" >> $GITHUB_ENV
fi
fi
- name: Build project
run: |
cd appimage/10
make
ln -v Magic-x86_64.AppImage "${MAGIC_APPIMAGE_OUTPUT_FILENAME}"
ls -l *.AppImage
sha256sum *.AppImage
pwd
- name: Create RELEASE-NOTES.txt
run: |
cd appimage/10
# Find the last tag (that does not match the current GITHUB_REF)
echo GITHUB_REF=$GITHUB_REF
echo GITHUB_SHA=$GITHUB_SHA
# GitHub CI is a shallow checkout by default (just the files needed to build)
# but we also want history back to next tag, see fetch-tags/fetch-depth actions/checkout~issue#1471
if [[ "$GITHUB_REF" =~ ^refs/tags/ ]]
then
# remove only if ref of tag (to avoid conflict during fetch)
git update-ref -d $GITHUB_REF
echo git_update_ref_exitstatus=$?
fi
set +e
git fetch --tags --prune --no-recurse-submodules --depth=149 origin +$GITHUB_SHA # fetch-tags: true # is broken
echo git_fetch_exitstatus=$?
git_show_ref=$(git show-ref --hash $GITHUB_REF) # get tagcommit hash
git_show_ref_exitstatus=$?
echo git_show_ref_exitstatus=$git_show_ref_exitstatus
echo git_show_ref=$git_show_ref
git_rev_list=$(git rev-list -n1 $GITHUB_REF) # get commit hash
git_rev_list_exitstatus=$?
echo git_rev_list_exitstatus=$git_rev_list_exitstatus
echo git_rev_list=$git_rev_list
set -e
test "$git_show_ref" = "$GITHUB_SHA" || test "$git_rev_list" = "$GITHUB_SHA" # check we got the ref back (or fail CI)
git_describe=$(git describe --tags $GITHUB_SHA | sed -e 's#\-\([0-9]\+\-g\)#\+\1#') # /-\d+-g/
echo git_describe=$git_describe
# RELEASE-NOTES-EL10.txt
echo "### ${MAGIC_APPIMAGE_OUTPUT_FILENAME} commit ${git_describe}" | sed -e 's#~#\\~#g' > RELEASE-NOTES-EL10.txt
echo "" >> RELEASE-NOTES-EL10.txt
echo "This release is based on EL10 (AlmaLinux10), the AppImage format is designed to run on a wide range of Linux distributions." >> RELEASE-NOTES-EL10.txt
echo "" >> RELEASE-NOTES-EL10.txt
echo "See documentation at https://github.com/${GITHUB_REPOSITORY}/blob/${GITHUB_SHA:0:8}/appimage/10/README.md" >> RELEASE-NOTES-EL10.txt
echo "" >> RELEASE-NOTES-EL10.txt
length_info=$(stat "--format=%s bytes" "${MAGIC_APPIMAGE_OUTPUT_FILENAME}")
sha256_info=$(sha256sum "${MAGIC_APPIMAGE_OUTPUT_FILENAME}" | cut -d ' ' -f1)
echo "| | |" >> RELEASE-NOTES-EL10.txt
echo "| :-------- | :------ |" >> RELEASE-NOTES-EL10.txt
echo "| File Name | ${MAGIC_APPIMAGE_OUTPUT_FILENAME} |" | sed -e 's#~#\\~#g' >> RELEASE-NOTES-EL10.txt
echo "| File Length | ${length_info} |" >> RELEASE-NOTES-EL10.txt
echo "| File SHA256 | ${sha256_info} |" >> RELEASE-NOTES-EL10.txt
echo "" >> RELEASE-NOTES-EL10.txt
# RELEASE-NOTES-CL.txt
set +e # allow this to fail to empty string
git_previous_tag=$(git describe --tags --abbrev=0 $(git rev-list --tags --skip=1 --max-count=1))
echo git_previous_tag=$git_previous_tag
set -e
if [ -n "${git_previous_tag}" ]
then
echo "### Change Log (since previous tag):" > RELEASE-NOTES-CL.txt
echo "\`\`\`" >> RELEASE-NOTES-CL.txt
git log --oneline --no-color --no-decorate "refs/tags/${git_previous_tag}..${GITHUB_REF}" >> RELEASE-NOTES-CL.txt
echo "\`\`\`" >> RELEASE-NOTES-CL.txt
else
echo "### Change Log (last commit only):" > RELEASE-NOTES-CL.txt
echo "\`\`\`" >> RELEASE-NOTES-CL.txt
git log --oneline -n1 --no-color --no-decorate "${GITHUB_REF}" >> RELEASE-NOTES-CL.txt
echo "\`\`\`" >> RELEASE-NOTES-CL.txt
fi
echo "" >> RELEASE-NOTES-CL.txt
#echo "### Build Info:" > RELEASE-NOTES-BI.txt
# FIXME extract package version info and DSO symvers into RELEASE-NOTES.txt
#echo "" >> RELEASE-NOTES-BI.txt
cat RELEASE-NOTES-CL.txt >> RELEASE-NOTES-EL10.txt
cat RELEASE-NOTES-EL10.txt
# RELEASE-NOTES-DOCS.txt
echo "See documentation at https://github.com/${GITHUB_REPOSITORY}/blob/${GITHUB_SHA:0:8}/appimage/7/README.md" >> RELEASE-NOTES-DOCS.txt
echo "See documentation at https://github.com/${GITHUB_REPOSITORY}/blob/${GITHUB_SHA:0:8}/appimage/8/README.md" >> RELEASE-NOTES-DOCS.txt
echo "See documentation at https://github.com/${GITHUB_REPOSITORY}/blob/${GITHUB_SHA:0:8}/appimage/9/README.md" >> RELEASE-NOTES-DOCS.txt
echo "See documentation at https://github.com/${GITHUB_REPOSITORY}/blob/${GITHUB_SHA:0:8}/appimage/10/README.md" >> RELEASE-NOTES-DOCS.txt
# RELEASE-NOTES-GH.txt (this is shared for all AppImage for one tag)
echo "### commit ${git_describe}" | sed -e 's#~#\\~#g' > RELEASE-NOTES-GH.txt
if [[ "$GITHUB_REF" =~ ^refs/tags/ ]]
then
# show tag annotation with tags like before
git tag --cleanup=strip "--format=%(contents)" -n "${GITHUB_REF:10}" | sed -e 's#\([~|]\)#\\\1#g' >> RELEASE-NOTES-GH.txt
fi
echo "" >> RELEASE-NOTES-GH.txt
cat RELEASE-NOTES-DOCS.txt >> RELEASE-NOTES-GH.txt
cat RELEASE-NOTES-CL.txt >> RELEASE-NOTES-GH.txt
# Show in action/artifact output
echo "## RELEASE NOTES" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
cat RELEASE-NOTES-EL10.txt >> $GITHUB_STEP_SUMMARY
- name: Upload Release Asset
if: ${{ env.MY_GITHUB_TAG != '' }} # if: ${{ github.ref_type == 'tag' }}
uses: softprops/action-gh-release@v2
with:
body_path: ${{ github.workspace }}/appimage/10/RELEASE-NOTES-GH.txt
files: |
${{ github.workspace }}/appimage/10/${{env.MAGIC_APPIMAGE_OUTPUT_FILENAME}}
${{ github.workspace }}/appimage/10/RELEASE-NOTES-EL10.txt
- name: Upload Artifact
#if: ${{ env.MY_GITHUB_TAG == '' }} # commented out to always upload
uses: actions/upload-artifact@v4
with:
name: ${{env.MAGIC_APPIMAGE_OUTPUT_FILENAME}}
path: |
${{ github.workspace }}/appimage/10/${{env.MAGIC_APPIMAGE_OUTPUT_FILENAME}}

View File

@ -1,170 +0,0 @@
on:
push:
tags:
- "*"
workflow_dispatch:
name: CI-appimage7
env:
APPIMAGETOOL_DOWNLOAD_URL: https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage
jobs:
build_appimage7:
name: Build AppImage EL7
runs-on: ubuntu-latest
permissions:
contents: write # action-gh-release
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 149 # enough to cover between tags
#fetch-tags: true # this should work see actions/checkout~issue#1471
- name: Get the version
id: get_version
run: |
git show -s
version=$(cat VERSION) # 8.9.999
version_tstamp=$(git show -s "--format=%cs" | tr -d '-') # YYYYMMDD
version_hash=$(git show -s "--format=%h") # abcdefg
version_num=$(ruby -e "print '$GITHUB_REF'.split('/')[2]") # legacy version method: master
echo "version=${version}"
echo "version_tstamp=${version_tstamp}"
echo "version_hash=${version_hash}"
echo "version_num=${version_num}"
VERSION_NUM="${version}~${version_tstamp}~${version_hash}"
echo "VERSION_NUM=${VERSION_NUM}" >> $GITHUB_ENV
echo "MAGIC_APPIMAGE_OUTPUT_FILENAME=Magic-${VERSION_NUM}-x86_64-EL7.AppImage" >> $GITHUB_ENV
# Is this GHA being run due to a push-on-tag ? if so we make a GitHub release, otherwise we just publish artifact
github_tag=$(echo -n "$GITHUB_REF" | sed -e 's#refs/tags/##') # 8.9.999
echo "github_tag=$github_tag"
if echo -n "$GITHUB_REF" | egrep -q "^refs/tags/" # check prefix
then
if [ -n "$github_tag" ]
then
echo "MY_GITHUB_TAG=${github_tag}" >> $GITHUB_ENV
fi
fi
- name: Build project
run: |
cd appimage/7
make
ln -v Magic-x86_64.AppImage "${MAGIC_APPIMAGE_OUTPUT_FILENAME}"
ls -l *.AppImage
sha256sum *.AppImage
pwd
- name: Create RELEASE-NOTES.txt
run: |
cd appimage/7
# Find the last tag (that does not match the current GITHUB_REF)
echo GITHUB_REF=$GITHUB_REF
echo GITHUB_SHA=$GITHUB_SHA
# GitHub CI is a shallow checkout by default (just the files needed to build)
# but we also want history back to next tag, see fetch-tags/fetch-depth actions/checkout~issue#1471
if [[ "$GITHUB_REF" =~ ^refs/tags/ ]]
then
# remove only if ref of tag (to avoid conflict during fetch)
git update-ref -d $GITHUB_REF
echo git_update_ref_exitstatus=$?
fi
set +e
git fetch --tags --prune --no-recurse-submodules --depth=149 origin +$GITHUB_SHA # fetch-tags: true # is broken
echo git_fetch_exitstatus=$?
git_show_ref=$(git show-ref --hash $GITHUB_REF) # get tagcommit hash
git_show_ref_exitstatus=$?
echo git_show_ref_exitstatus=$git_show_ref_exitstatus
echo git_show_ref=$git_show_ref
git_rev_list=$(git rev-list -n1 $GITHUB_REF) # get commit hash
git_rev_list_exitstatus=$?
echo git_rev_list_exitstatus=$git_rev_list_exitstatus
echo git_rev_list=$git_rev_list
set -e
test "$git_show_ref" = "$GITHUB_SHA" || test "$git_rev_list" = "$GITHUB_SHA" # check we got the ref back (or fail CI)
git_describe=$(git describe --tags $GITHUB_SHA | sed -e 's#\-\([0-9]\+\-g\)#\+\1#') # /-\d+-g/
echo git_describe=$git_describe
# RELEASE-NOTES-EL7.txt
echo "### ${MAGIC_APPIMAGE_OUTPUT_FILENAME} commit ${git_describe}" | sed -e 's#~#\\~#g' > RELEASE-NOTES-EL7.txt
echo "" >> RELEASE-NOTES-EL7.txt
echo "This release is based on EL7 (CentOS7), the AppImage format is designed to run on a wide range of Linux distributions." >> RELEASE-NOTES-EL7.txt
echo "" >> RELEASE-NOTES-EL7.txt
echo "See documentation at https://github.com/${GITHUB_REPOSITORY}/blob/${GITHUB_SHA:0:8}/appimage/7/README.md" >> RELEASE-NOTES-EL7.txt
echo "" >> RELEASE-NOTES-EL7.txt
length_info=$(stat "--format=%s bytes" "${MAGIC_APPIMAGE_OUTPUT_FILENAME}")
sha256_info=$(sha256sum "${MAGIC_APPIMAGE_OUTPUT_FILENAME}" | cut -d ' ' -f1)
echo "| | |" >> RELEASE-NOTES-EL7.txt
echo "| :-------- | :------ |" >> RELEASE-NOTES-EL7.txt
echo "| File Name | ${MAGIC_APPIMAGE_OUTPUT_FILENAME} |" | sed -e 's#~#\\~#g' >> RELEASE-NOTES-EL7.txt
echo "| File Length | ${length_info} |" >> RELEASE-NOTES-EL7.txt
echo "| File SHA256 | ${sha256_info} |" >> RELEASE-NOTES-EL7.txt
echo "" >> RELEASE-NOTES-EL7.txt
# RELEASE-NOTES-CL.txt
set +e # allow this to fail to empty string
git_previous_tag=$(git describe --tags --abbrev=0 $(git rev-list --tags --skip=1 --max-count=1))
echo git_previous_tag=$git_previous_tag
set -e
if [ -n "${git_previous_tag}" ]
then
echo "### Change Log (since previous tag):" > RELEASE-NOTES-CL.txt
echo "\`\`\`" >> RELEASE-NOTES-CL.txt
git log --oneline --no-color --no-decorate "refs/tags/${git_previous_tag}..${GITHUB_REF}" >> RELEASE-NOTES-CL.txt
echo "\`\`\`" >> RELEASE-NOTES-CL.txt
else
echo "### Change Log (last commit only):" > RELEASE-NOTES-CL.txt
echo "\`\`\`" >> RELEASE-NOTES-CL.txt
git log --oneline -n1 --no-color --no-decorate "${GITHUB_REF}" >> RELEASE-NOTES-CL.txt
echo "\`\`\`" >> RELEASE-NOTES-CL.txt
fi
echo "" >> RELEASE-NOTES-CL.txt
#echo "### Build Info:" > RELEASE-NOTES-BI.txt
# FIXME extract package version info and DSO symvers into RELEASE-NOTES.txt
#echo "" >> RELEASE-NOTES-BI.txt
cat RELEASE-NOTES-CL.txt >> RELEASE-NOTES-EL7.txt
cat RELEASE-NOTES-EL7.txt
# RELEASE-NOTES-DOCS.txt
echo "See documentation at https://github.com/${GITHUB_REPOSITORY}/blob/${GITHUB_SHA:0:8}/appimage/7/README.md" >> RELEASE-NOTES-DOCS.txt
echo "See documentation at https://github.com/${GITHUB_REPOSITORY}/blob/${GITHUB_SHA:0:8}/appimage/8/README.md" >> RELEASE-NOTES-DOCS.txt
echo "See documentation at https://github.com/${GITHUB_REPOSITORY}/blob/${GITHUB_SHA:0:8}/appimage/9/README.md" >> RELEASE-NOTES-DOCS.txt
echo "See documentation at https://github.com/${GITHUB_REPOSITORY}/blob/${GITHUB_SHA:0:8}/appimage/10/README.md" >> RELEASE-NOTES-DOCS.txt
# RELEASE-NOTES-GH.txt (this is shared for all AppImage for one tag)
echo "### commit ${git_describe}" | sed -e 's#~#\\~#g' > RELEASE-NOTES-GH.txt
if [[ "$GITHUB_REF" =~ ^refs/tags/ ]]
then
# show tag annotation with tags like before
git tag --cleanup=strip "--format=%(contents)" -n "${GITHUB_REF:10}" | sed -e 's#\([~|]\)#\\\1#g' >> RELEASE-NOTES-GH.txt
fi
echo "" >> RELEASE-NOTES-GH.txt
cat RELEASE-NOTES-DOCS.txt >> RELEASE-NOTES-GH.txt
cat RELEASE-NOTES-CL.txt >> RELEASE-NOTES-GH.txt
# Show in action/artifact output
echo "## RELEASE NOTES" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
cat RELEASE-NOTES-EL7.txt >> $GITHUB_STEP_SUMMARY
- name: Upload Release Asset
if: ${{ env.MY_GITHUB_TAG != '' }} # if: ${{ github.ref_type == 'tag' }}
uses: softprops/action-gh-release@v2
with:
body_path: ${{ github.workspace }}/appimage/7/RELEASE-NOTES-GH.txt
files: |
${{ github.workspace }}/appimage/7/${{env.MAGIC_APPIMAGE_OUTPUT_FILENAME}}
${{ github.workspace }}/appimage/7/RELEASE-NOTES-EL7.txt
- name: Upload Artifact
#if: ${{ env.MY_GITHUB_TAG == '' }} # commented out to always upload
uses: actions/upload-artifact@v4
with:
name: ${{env.MAGIC_APPIMAGE_OUTPUT_FILENAME}}
path: |
${{ github.workspace }}/appimage/7/${{env.MAGIC_APPIMAGE_OUTPUT_FILENAME}}

View File

@ -1,170 +0,0 @@
on:
push:
tags:
- "*"
workflow_dispatch:
name: CI-appimage8
env:
APPIMAGETOOL_DOWNLOAD_URL: https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage
jobs:
build_appimage8:
name: Build AppImage EL8
runs-on: ubuntu-latest
permissions:
contents: write # action-gh-release
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 149 # enough to cover between tags
#fetch-tags: true # this should work see actions/checkout~issue#1471
- name: Get the version
id: get_version
run: |
git show -s
version=$(cat VERSION) # 8.9.999
version_tstamp=$(git show -s "--format=%cs" | tr -d '-') # YYYYMMDD
version_hash=$(git show -s "--format=%h") # abcdefg
version_num=$(ruby -e "print '$GITHUB_REF'.split('/')[2]") # legacy version method: master
echo "version=${version}"
echo "version_tstamp=${version_tstamp}"
echo "version_hash=${version_hash}"
echo "version_num=${version_num}"
VERSION_NUM="${version}~${version_tstamp}~${version_hash}"
echo "VERSION_NUM=${VERSION_NUM}" >> $GITHUB_ENV
echo "MAGIC_APPIMAGE_OUTPUT_FILENAME=Magic-${VERSION_NUM}-x86_64-EL8.AppImage" >> $GITHUB_ENV
# Is this GHA being run due to a push-on-tag ? if so we make a GitHub release, otherwise we just publish artifact
github_tag=$(echo -n "$GITHUB_REF" | sed -e 's#refs/tags/##') # 8.9.999
echo "github_tag=$github_tag"
if echo -n "$GITHUB_REF" | egrep -q "^refs/tags/" # check prefix
then
if [ -n "$github_tag" ]
then
echo "MY_GITHUB_TAG=${github_tag}" >> $GITHUB_ENV
fi
fi
- name: Build project
run: |
cd appimage/8
make
ln -v Magic-x86_64.AppImage "${MAGIC_APPIMAGE_OUTPUT_FILENAME}"
ls -l *.AppImage
sha256sum *.AppImage
pwd
- name: Create RELEASE-NOTES.txt
run: |
cd appimage/8
# Find the last tag (that does not match the current GITHUB_REF)
echo GITHUB_REF=$GITHUB_REF
echo GITHUB_SHA=$GITHUB_SHA
# GitHub CI is a shallow checkout by default (just the files needed to build)
# but we also want history back to next tag, see fetch-tags/fetch-depth actions/checkout~issue#1471
if [[ "$GITHUB_REF" =~ ^refs/tags/ ]]
then
# remove only if ref of tag (to avoid conflict during fetch)
git update-ref -d $GITHUB_REF
echo git_update_ref_exitstatus=$?
fi
set +e
git fetch --tags --prune --no-recurse-submodules --depth=149 origin +$GITHUB_SHA # fetch-tags: true # is broken
echo git_fetch_exitstatus=$?
git_show_ref=$(git show-ref --hash $GITHUB_REF) # get tagcommit hash
git_show_ref_exitstatus=$?
echo git_show_ref_exitstatus=$git_show_ref_exitstatus
echo git_show_ref=$git_show_ref
git_rev_list=$(git rev-list -n1 $GITHUB_REF) # get commit hash
git_rev_list_exitstatus=$?
echo git_rev_list_exitstatus=$git_rev_list_exitstatus
echo git_rev_list=$git_rev_list
set -e
test "$git_show_ref" = "$GITHUB_SHA" || test "$git_rev_list" = "$GITHUB_SHA" # check we got the ref back (or fail CI)
git_describe=$(git describe --tags $GITHUB_SHA | sed -e 's#\-\([0-9]\+\-g\)#\+\1#') # /-\d+-g/
echo git_describe=$git_describe
# RELEASE-NOTES-EL8.txt
echo "### ${MAGIC_APPIMAGE_OUTPUT_FILENAME} commit ${git_describe}" | sed -e 's#~#\\~#g' > RELEASE-NOTES-EL8.txt
echo "" >> RELEASE-NOTES-EL8.txt
echo "This release is based on EL8 (AlmaLinux8), the AppImage format is designed to run on a wide range of Linux distributions." >> RELEASE-NOTES-EL8.txt
echo "" >> RELEASE-NOTES-EL8.txt
echo "See documentation at https://github.com/${GITHUB_REPOSITORY}/blob/${GITHUB_SHA:0:8}/appimage/8/README.md" >> RELEASE-NOTES-EL8.txt
echo "" >> RELEASE-NOTES-EL8.txt
length_info=$(stat "--format=%s bytes" "${MAGIC_APPIMAGE_OUTPUT_FILENAME}")
sha256_info=$(sha256sum "${MAGIC_APPIMAGE_OUTPUT_FILENAME}" | cut -d ' ' -f1)
echo "| | |" >> RELEASE-NOTES-EL8.txt
echo "| :-------- | :------ |" >> RELEASE-NOTES-EL8.txt
echo "| File Name | ${MAGIC_APPIMAGE_OUTPUT_FILENAME} |" | sed -e 's#~#\\~#g' >> RELEASE-NOTES-EL8.txt
echo "| File Length | ${length_info} |" >> RELEASE-NOTES-EL8.txt
echo "| File SHA256 | ${sha256_info} |" >> RELEASE-NOTES-EL8.txt
echo "" >> RELEASE-NOTES-EL8.txt
# RELEASE-NOTES-CL.txt
set +e # allow this to fail to empty string
git_previous_tag=$(git describe --tags --abbrev=0 $(git rev-list --tags --skip=1 --max-count=1))
echo git_previous_tag=$git_previous_tag
set -e
if [ -n "${git_previous_tag}" ]
then
echo "### Change Log (since previous tag):" > RELEASE-NOTES-CL.txt
echo "\`\`\`" >> RELEASE-NOTES-CL.txt
git log --oneline --no-color --no-decorate "refs/tags/${git_previous_tag}..${GITHUB_REF}" >> RELEASE-NOTES-CL.txt
echo "\`\`\`" >> RELEASE-NOTES-CL.txt
else
echo "### Change Log (last commit only):" > RELEASE-NOTES-CL.txt
echo "\`\`\`" >> RELEASE-NOTES-CL.txt
git log --oneline -n1 --no-color --no-decorate "${GITHUB_REF}" >> RELEASE-NOTES-CL.txt
echo "\`\`\`" >> RELEASE-NOTES-CL.txt
fi
echo "" >> RELEASE-NOTES-CL.txt
#echo "### Build Info:" > RELEASE-NOTES-BI.txt
# FIXME extract package version info and DSO symvers into RELEASE-NOTES.txt
#echo "" >> RELEASE-NOTES-BI.txt
cat RELEASE-NOTES-CL.txt >> RELEASE-NOTES-EL8.txt
cat RELEASE-NOTES-EL8.txt
# RELEASE-NOTES-DOCS.txt
echo "See documentation at https://github.com/${GITHUB_REPOSITORY}/blob/${GITHUB_SHA:0:8}/appimage/7/README.md" >> RELEASE-NOTES-DOCS.txt
echo "See documentation at https://github.com/${GITHUB_REPOSITORY}/blob/${GITHUB_SHA:0:8}/appimage/8/README.md" >> RELEASE-NOTES-DOCS.txt
echo "See documentation at https://github.com/${GITHUB_REPOSITORY}/blob/${GITHUB_SHA:0:8}/appimage/9/README.md" >> RELEASE-NOTES-DOCS.txt
echo "See documentation at https://github.com/${GITHUB_REPOSITORY}/blob/${GITHUB_SHA:0:8}/appimage/10/README.md" >> RELEASE-NOTES-DOCS.txt
# RELEASE-NOTES-GH.txt (this is shared for all AppImage for one tag)
echo "### commit ${git_describe}" | sed -e 's#~#\\~#g' > RELEASE-NOTES-GH.txt
if [[ "$GITHUB_REF" =~ ^refs/tags/ ]]
then
# show tag annotation with tags like before
git tag --cleanup=strip "--format=%(contents)" -n "${GITHUB_REF:10}" | sed -e 's#\([~|]\)#\\\1#g' >> RELEASE-NOTES-GH.txt
fi
echo "" >> RELEASE-NOTES-GH.txt
cat RELEASE-NOTES-DOCS.txt >> RELEASE-NOTES-GH.txt
cat RELEASE-NOTES-CL.txt >> RELEASE-NOTES-GH.txt
# Show in action/artifact output
echo "## RELEASE NOTES" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
cat RELEASE-NOTES-EL8.txt >> $GITHUB_STEP_SUMMARY
- name: Upload Release Asset
if: ${{ env.MY_GITHUB_TAG != '' }} # if: ${{ github.ref_type == 'tag' }}
uses: softprops/action-gh-release@v2
with:
body_path: ${{ github.workspace }}/appimage/8/RELEASE-NOTES-GH.txt
files: |
${{ github.workspace }}/appimage/8/${{env.MAGIC_APPIMAGE_OUTPUT_FILENAME}}
${{ github.workspace }}/appimage/8/RELEASE-NOTES-EL8.txt
- name: Upload Artifact
#if: ${{ env.MY_GITHUB_TAG == '' }} # commented out to always upload
uses: actions/upload-artifact@v4
with:
name: ${{env.MAGIC_APPIMAGE_OUTPUT_FILENAME}}
path: |
${{ github.workspace }}/appimage/8/${{env.MAGIC_APPIMAGE_OUTPUT_FILENAME}}

View File

@ -1,170 +0,0 @@
on:
push:
tags:
- "*"
workflow_dispatch:
name: CI-appimage9
env:
APPIMAGETOOL_DOWNLOAD_URL: https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage
jobs:
build_appimage9:
name: Build AppImage EL9
runs-on: ubuntu-latest
permissions:
contents: write # action-gh-release
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 149 # enough to cover between tags
#fetch-tags: true # this should work see actions/checkout~issue#1471
- name: Get the version
id: get_version
run: |
git show -s
version=$(cat VERSION) # 8.9.999
version_tstamp=$(git show -s "--format=%cs" | tr -d '-') # YYYYMMDD
version_hash=$(git show -s "--format=%h") # abcdefg
version_num=$(ruby -e "print '$GITHUB_REF'.split('/')[2]") # legacy version method: master
echo "version=${version}"
echo "version_tstamp=${version_tstamp}"
echo "version_hash=${version_hash}"
echo "version_num=${version_num}"
VERSION_NUM="${version}~${version_tstamp}~${version_hash}"
echo "VERSION_NUM=${VERSION_NUM}" >> $GITHUB_ENV
echo "MAGIC_APPIMAGE_OUTPUT_FILENAME=Magic-${VERSION_NUM}-x86_64-EL9.AppImage" >> $GITHUB_ENV
# Is this GHA being run due to a push-on-tag ? if so we make a GitHub release, otherwise we just publish artifact
github_tag=$(echo -n "$GITHUB_REF" | sed -e 's#refs/tags/##') # 8.9.999
echo "github_tag=$github_tag"
if echo -n "$GITHUB_REF" | egrep -q "^refs/tags/" # check prefix
then
if [ -n "$github_tag" ]
then
echo "MY_GITHUB_TAG=${github_tag}" >> $GITHUB_ENV
fi
fi
- name: Build project
run: |
cd appimage/9
make
ln -v Magic-x86_64.AppImage "${MAGIC_APPIMAGE_OUTPUT_FILENAME}"
ls -l *.AppImage
sha256sum *.AppImage
pwd
- name: Create RELEASE-NOTES.txt
run: |
cd appimage/9
# Find the last tag (that does not match the current GITHUB_REF)
echo GITHUB_REF=$GITHUB_REF
echo GITHUB_SHA=$GITHUB_SHA
# GitHub CI is a shallow checkout by default (just the files needed to build)
# but we also want history back to next tag, see fetch-tags/fetch-depth actions/checkout~issue#1471
if [[ "$GITHUB_REF" =~ ^refs/tags/ ]]
then
# remove only if ref of tag (to avoid conflict during fetch)
git update-ref -d $GITHUB_REF
echo git_update_ref_exitstatus=$?
fi
set +e
git fetch --tags --prune --no-recurse-submodules --depth=149 origin +$GITHUB_SHA # fetch-tags: true # is broken
echo git_fetch_exitstatus=$?
git_show_ref=$(git show-ref --hash $GITHUB_REF) # get tagcommit hash
git_show_ref_exitstatus=$?
echo git_show_ref_exitstatus=$git_show_ref_exitstatus
echo git_show_ref=$git_show_ref
git_rev_list=$(git rev-list -n1 $GITHUB_REF) # get commit hash
git_rev_list_exitstatus=$?
echo git_rev_list_exitstatus=$git_rev_list_exitstatus
echo git_rev_list=$git_rev_list
set -e
test "$git_show_ref" = "$GITHUB_SHA" || test "$git_rev_list" = "$GITHUB_SHA" # check we got the ref back (or fail CI)
git_describe=$(git describe --tags $GITHUB_SHA | sed -e 's#\-\([0-9]\+\-g\)#\+\1#') # /-\d+-g/
echo git_describe=$git_describe
# RELEASE-NOTES-EL9.txt
echo "### ${MAGIC_APPIMAGE_OUTPUT_FILENAME} commit ${git_describe}" | sed -e 's#~#\\~#g' > RELEASE-NOTES-EL9.txt
echo "" >> RELEASE-NOTES-EL9.txt
echo "This release is based on EL9 (AlmaLinux9), the AppImage format is designed to run on a wide range of Linux distributions." >> RELEASE-NOTES-EL9.txt
echo "" >> RELEASE-NOTES-EL9.txt
echo "See documentation at https://github.com/${GITHUB_REPOSITORY}/blob/${GITHUB_SHA:0:8}/appimage/9/README.md" >> RELEASE-NOTES-EL9.txt
echo "" >> RELEASE-NOTES-EL9.txt
length_info=$(stat "--format=%s bytes" "${MAGIC_APPIMAGE_OUTPUT_FILENAME}")
sha256_info=$(sha256sum "${MAGIC_APPIMAGE_OUTPUT_FILENAME}" | cut -d ' ' -f1)
echo "| | |" >> RELEASE-NOTES-EL9.txt
echo "| :-------- | :------ |" >> RELEASE-NOTES-EL9.txt
echo "| File Name | ${MAGIC_APPIMAGE_OUTPUT_FILENAME} |" | sed -e 's#~#\\~#g' >> RELEASE-NOTES-EL9.txt
echo "| File Length | ${length_info} |" >> RELEASE-NOTES-EL9.txt
echo "| File SHA256 | ${sha256_info} |" >> RELEASE-NOTES-EL9.txt
echo "" >> RELEASE-NOTES-EL9.txt
# RELEASE-NOTES-CL.txt
set +e # allow this to fail to empty string
git_previous_tag=$(git describe --tags --abbrev=0 $(git rev-list --tags --skip=1 --max-count=1))
echo git_previous_tag=$git_previous_tag
set -e
if [ -n "${git_previous_tag}" ]
then
echo "### Change Log (since previous tag):" > RELEASE-NOTES-CL.txt
echo "\`\`\`" >> RELEASE-NOTES-CL.txt
git log --oneline --no-color --no-decorate "refs/tags/${git_previous_tag}..${GITHUB_REF}" >> RELEASE-NOTES-CL.txt
echo "\`\`\`" >> RELEASE-NOTES-CL.txt
else
echo "### Change Log (last commit only):" > RELEASE-NOTES-CL.txt
echo "\`\`\`" >> RELEASE-NOTES-CL.txt
git log --oneline -n1 --no-color --no-decorate "${GITHUB_REF}" >> RELEASE-NOTES-CL.txt
echo "\`\`\`" >> RELEASE-NOTES-CL.txt
fi
echo "" >> RELEASE-NOTES-CL.txt
#echo "### Build Info:" > RELEASE-NOTES-BI.txt
# FIXME extract package version info and DSO symvers into RELEASE-NOTES.txt
#echo "" >> RELEASE-NOTES-BI.txt
cat RELEASE-NOTES-CL.txt >> RELEASE-NOTES-EL9.txt
cat RELEASE-NOTES-EL9.txt
# RELEASE-NOTES-DOCS.txt
echo "See documentation at https://github.com/${GITHUB_REPOSITORY}/blob/${GITHUB_SHA:0:8}/appimage/7/README.md" >> RELEASE-NOTES-DOCS.txt
echo "See documentation at https://github.com/${GITHUB_REPOSITORY}/blob/${GITHUB_SHA:0:8}/appimage/8/README.md" >> RELEASE-NOTES-DOCS.txt
echo "See documentation at https://github.com/${GITHUB_REPOSITORY}/blob/${GITHUB_SHA:0:8}/appimage/9/README.md" >> RELEASE-NOTES-DOCS.txt
echo "See documentation at https://github.com/${GITHUB_REPOSITORY}/blob/${GITHUB_SHA:0:8}/appimage/10/README.md" >> RELEASE-NOTES-DOCS.txt
# RELEASE-NOTES-GH.txt (this is shared for all AppImage for one tag)
echo "### commit ${git_describe}" | sed -e 's#~#\\~#g' > RELEASE-NOTES-GH.txt
if [[ "$GITHUB_REF" =~ ^refs/tags/ ]]
then
# show tag annotation with tags like before
git tag --cleanup=strip "--format=%(contents)" -n "${GITHUB_REF:10}" | sed -e 's#\([~|]\)#\\\1#g' >> RELEASE-NOTES-GH.txt
fi
echo "" >> RELEASE-NOTES-GH.txt
cat RELEASE-NOTES-DOCS.txt >> RELEASE-NOTES-GH.txt
cat RELEASE-NOTES-CL.txt >> RELEASE-NOTES-GH.txt
# Show in action/artifact output
echo "## RELEASE NOTES" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
cat RELEASE-NOTES-EL9.txt >> $GITHUB_STEP_SUMMARY
- name: Upload Release Asset
if: ${{ env.MY_GITHUB_TAG != '' }} # if: ${{ github.ref_type == 'tag' }}
uses: softprops/action-gh-release@v2
with:
body_path: ${{ github.workspace }}/appimage/9/RELEASE-NOTES-GH.txt
files: |
${{ github.workspace }}/appimage/9/${{env.MAGIC_APPIMAGE_OUTPUT_FILENAME}}
${{ github.workspace }}/appimage/9/RELEASE-NOTES-EL9.txt
- name: Upload Artifact
#if: ${{ env.MY_GITHUB_TAG == '' }} # commented out to always upload
uses: actions/upload-artifact@v4
with:
name: ${{env.MAGIC_APPIMAGE_OUTPUT_FILENAME}}
path: |
${{ github.workspace }}/appimage/9/${{env.MAGIC_APPIMAGE_OUTPUT_FILENAME}}

View File

@ -1,291 +0,0 @@
name: CI-canary-matrix
on:
push:
tags:
- "*"
workflow_dispatch:
jobs:
canary:
strategy:
max-parallel: 3
matrix:
os: [ubuntu-24.04, ubuntu-22.04]
# Configure Options
# X11 OGL CAIRO
pkgs: [all, none, no_tk_tcl_rl, no_tk_tcl_brl, no_zlib, no_gc_gl_gu, no_gc, no_gl_gu]
# Toolchain
# ubuntu-20.04 [gcc-9, clang-10]
# ubuntu-22.04 [gcc-11, clang-14]
# ubuntu-24.04 [gcc-13, clang-18]
tc: [default, gcc-10, gcc-11, gcc-12, gcc-13, gcc-14, clang-14, clang-15, clang-17, clang-18, clang-19]
exclude:
- os: ubuntu-22.04
tc: gcc-13
- os: ubuntu-22.04
tc: gcc-14
- os: ubuntu-22.04
tc: clang-17
- os: ubuntu-22.04 # some sources show this as present but not found
tc: clang-18
- os: ubuntu-22.04
tc: clang-19
- os: ubuntu-24.04
tc: gcc-10
- os: ubuntu-24.04
tc: gcc-11
- os: ubuntu-24.04
tc: clang-14
- os: ubuntu-24.04
tc: clang-15
fail-fast: false
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Matrix Check
env:
MATRIX_OS: ${{ matrix.os }}
MATRIX_PKGS: ${{ matrix.pkgs }}
MATRIX_TC: ${{ matrix.tc }}
run: |
# This takes the macros params ENV and processes into options list
if [ "${MATRIX_PKGS}" = "none" ]
then
pkgs=""
cfgs=""
else
pkgs="kcnrzCLUX"
cfgs=""
fi
# z no.*_zl zlib1g-dev
# n no.*_nc libncurses-dev
# r no.*_rl libreadline-dev
# R no.*_brl --enable-readline-bundled
# c no.*_tcl tcl-dev
# k no.*_tk tk-dev
# C no.*_gc libcairo-dev
# L no.*_gl libgl-dev
# U no.*_gu libglu1-mesa-dev # GLU requires GL
# X no.*_gx libx11-dev
if echo -n "$MATRIX_PKGS" | grep -q "^no.*_zl"; then
pkgs=$(echo -n "$pkgs" | sed -e 's#z##'); fi
if echo -n "$MATRIX_PKGS" | grep -q "^no.*_nc"; then
pkgs=$(echo -n "$pkgs" | sed -e 's#n##'); fi
if echo -n "$MATRIX_PKGS" | grep -q "^no.*_brl"; then
pkgs=$(echo -n "$pkgs" | sed -e 's#r#R#'); fi # replace
if echo -n "$MATRIX_PKGS" | grep -q "^no.*_rl"; then
pkgs=$(echo -n "$pkgs" | sed -e 's#r##'); fi
if echo -n "$MATRIX_PKGS" | grep -q "^no.*_tcl"; then
pkgs=$(echo -n "$pkgs" | sed -e 's#c##'); fi
if echo -n "$MATRIX_PKGS" | grep -q "^no.*_tk"; then
pkgs=$(echo -n "$pkgs" | sed -e 's#k##'); fi
if echo -n "$MATRIX_PKGS" | grep -q "^no.*_gc"; then
pkgs=$(echo -n "$pkgs" | sed -e 's#C##'); fi
if echo -n "$MATRIX_PKGS" | grep -q "^no.*_gl"; then
pkgs=$(echo -n "$pkgs" | sed -e 's#L##'); fi
if echo -n "$MATRIX_PKGS" | grep -q "^no.*_gu"; then
pkgs=$(echo -n "$pkgs" | sed -e 's#U##'); fi
if echo -n "$MATRIX_PKGS" | grep -q "^no.*_gx"; then
pkgs=$(echo -n "$pkgs" | sed -e 's#X##'); fi
_package_list=()
echo -n $pkgs | grep -q "z" && _package_list+=(zlib1g-dev)
echo -n $pkgs | grep -q "n" && _package_list+=(libncurses-dev)
echo -n $pkgs | grep -q "r" && _package_list+=(libreadline-dev)
echo -n $pkgs | grep -q "c" && _package_list+=(tcl-dev)
echo -n $pkgs | grep -q "k" && _package_list+=(tk-dev)
echo -n $pkgs | grep -q "C" && _package_list+=(libcairo-dev)
echo -n $pkgs | grep -q "L" && _package_list+=(libgl-dev)
echo -n $pkgs | grep -q "U" && _package_list+=(libglu1-mesa-dev)
echo -n $pkgs | grep -q "X" && _package_list+=(libx11-dev)
echo "PACKAGE_LIST=${_package_list[*]}" >> $GITHUB_ENV
#
_configure_args=()
if echo -n "$MATRIX_PKGS" | grep -q "^no.*_zl"; then
_configure_args+=(--disable-compression); fi
if echo -n "$MATRIX_PKGS" | grep -q "^no.*_brl"; then
_configure_args+=(--enable-readline-bundled); fi
if echo -n "$MATRIX_PKGS" | grep -q "^no.*_rl"; then
_configure_args+=(--disable-readline); fi
if echo -n "$MATRIX_PKGS" | grep -q "^no.*_tcl"; then
_configure_args+=(--without-tcl); fi
if echo -n "$MATRIX_PKGS" | grep -q "^no.*_tk"; then
_configure_args+=(--without-tk); fi
if echo -n "$MATRIX_PKGS" | grep -q "^no.*_gc"; then
_configure_args+=(--without-cairo); fi
if echo -n "$MATRIX_PKGS" | grep -q "^no.*_gl"; then
_configure_args+=(--without-opengl); fi
echo "CONFIGURE_ARGS=${_configure_args[*]}" >> $GITHUB_ENV
- name: Setup Toolchain
env:
MATRIX_TC: ${{ matrix.tc }}
run: |
# decode settings
BUILD_GCC_VERSION=$( echo -n "$MATRIX_TC" | grep -i "^gcc" | sed -e 's#^gcc\-\?##i')
BUILD_CLANG_VERSION=$(echo -n "$MATRIX_TC" | grep -i "^clang" | sed -e 's#^clang\-\?##i')
echo "BUILD_GCC_VERSION=$BUILD_GCC_VERSION" >> $GITHUB_ENV
echo "BUILD_CLANG_VERSION=$BUILD_CLANG_VERSION" >> $GITHUB_ENV
sudo apt-get update
if [ -n "$BUILD_GCC_VERSION" ]
then
GCCV=$BUILD_GCC_VERSION
# https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2404-Readme.md
sudo apt-get install gcc-${GCCV} g++-${GCCV} cpp-${GCCV}
gcc-${GCCV} -v
g++-${GCCV} -v
cpp-${GCCV} -v < /dev/null
ls -l /usr/bin/g++ /usr/bin/g++-[0-9]* /usr/bin/gcc /usr/bin/gcc-[0-9]* /usr/bin/cpp-* /usr/bin/*-gnu-cpp* || true
update-alternatives --list gcc || true
update-alternatives --list g++ || true
update-alternatives --list cpp || true
update-alternatives --query gcc || true
update-alternatives --query g++ || true
update-alternatives --query cpp || true
ls -l /usr/bin/g++ /usr/bin/g++-[0-9]* /usr/bin/gcc /usr/bin/gcc-[0-9]* /usr/bin/cpp-* /usr/bin/*-gnu-cpp* || true
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-${GCCV} 50
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-${GCCV} 50
sudo update-alternatives --install "/usr/bin/$(uname -m)-linux-gnu-cpp" cpp "/usr/bin/$(uname -m)-linux-gnu-cpp-${GCCV}" 50
ls -l /usr/bin/g++ /usr/bin/g++-[0-9]* /usr/bin/gcc /usr/bin/gcc-[0-9]* /usr/bin/cpp-* /usr/bin/*-gnu-cpp* || true
update-alternatives --list gcc || true
update-alternatives --list g++ || true
update-alternatives --list cpp || true
hash -r
gcc -v
elif [ -n "$BUILD_CLANG_VERSION" ]
then
CLANGV=$BUILD_CLANG_VERSION
# https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2404-Readme.md
sudo apt-get install clang-${CLANGV} clang++-${CLANGV} #clang-cpp-${CLANGV}
clang-${CLANGV} -v
clang++-${CLANGV} -v
clang-cpp-${CLANGV} -v < /dev/null
ls -l /usr/bin/clang++ /usr/bin/clang++-[0-9]* /usr/bin/clang /usr/bin/clang-[0-9]* /usr/bin/clang-cpp-* /usr/bin/clang-cpp* || true
update-alternatives --list clang || true
update-alternatives --list clang++ || true
update-alternatives --list clang-cpp || true
update-alternatives --query clang || true
update-alternatives --query clang++ || true
update-alternatives --query clang-cpp || true
ls -l /usr/bin/clang++ /usr/bin/clang++-[0-9]* /usr/bin/clang /usr/bin/clang-[0-9]* /usr/bin/clang-cpp-* /usr/bin/clang-cpp* || true
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-${CLANGV} 50
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-${CLANGV} 50
sudo update-alternatives --install "/usr/bin/clang-cpp" clang-cpp "/usr/bin/clang-cpp-${CLANGV}" 50
ls -l /usr/bin/clang++ /usr/bin/clang++-[0-9]* /usr/bin/clang /usr/bin/clang-[0-9]* /usr/bin/clang-cpp-* /usr/bin/clang-cpp* || true
update-alternatives --list clang || true
update-alternatives --list clang++ || true
update-alternatives --list clang-cpp || true
hash -r
clang -v
fi
- name: Get Dependencies
run: |
if [ -n "$PACKAGE_LIST" ]
then
sudo apt-get install -y ${PACKAGE_LIST}
fi
- name: Build
run: |
if [ -n "$BUILD_CLANG_VERSION" ]
then
export CC="clang-${BUILD_CLANG_VERSION}"
export CXX="clang++-${BUILD_CLANG_VERSION}"
export CPP="clang-cpp-${BUILD_CLANG_VERSION}"
fi
set -o pipefail # due to pipe inside CI
./configure $CONFIGURE_ARGS 2>&1 | tee CONFIGURE.LOG
egrep "^(CPP|CXX|CC)\s" defs.mak
# Add -Wall for CI loggings
sed -e 's# -Werror=# -Wall -Werror=#' -i defs.mak
# Non security/reliability related warnings
#sed -e 's# -Werror=# -Wno-unused-variable -Werror=#' -i defs.mak
#sed -e 's# -Werror=# -Wno-unused-local-typedefs -Werror=#' -i defs.mak
#sed -e 's# -Werror=# -Wno-unused-label -Werror=#' -i defs.mak
#sed -e 's# -Werror=# -Wno-unused-but-set-variable -Werror=#' -i defs.mak
make database/database.h
make -j$(nproc) 2>&1 | tee MAKE.LOG
- name: Summary
env:
MATRIX_OS: ${{ matrix.os }}
MATRIX_PKGS: ${{ matrix.pkgs }}
run: |
set +e
grep "error:" MAKE.LOG > MAKE_error.LOG
grep "warning:" MAKE.LOG > MAKE_warning.LOG
# Less important warnings relating to codesmell more than security (filter out of headline)
grep -v "Wunused-variable" MAKE_warning.LOG |
grep -v "Wunused-local-typedefs" |
grep -v "Wunused-label" |
grep -v "Wunused-but-set-variable" > MAKE_warning_filtered.LOG
ls -l
wc -l *.LOG
error_count=$( grep -c "error:" MAKE_error.LOG)
filtered_warning_count=$(grep -c "warning:" MAKE_warning_filtered.LOG)
title="### $(cat VERSION) ${MATRIX_OS} ${MATRIX_TC} ${MATRIX_PKGS} :: "
if [ "$error_count" -gt 0 ]
then
title="$title $error_count error(s)"
fi
if [ "$filtered_warning_count" -gt 0 ]
then
title="$title $filtered_warning_count warning(s)"
fi
(
total_error_count=$( wc -l MAKE_error.LOG | cut -d' ' -f1)
total_warning_count=$(wc -l MAKE_warning.LOG | cut -d' ' -f1)
echo "$title"
echo ""
echo "PACKAGE_LIST=$PACKAGE_LIST"
echo "CONFIGURE_ARGS=$CONFIGURE_ARGS"
echo ""
if [ "$BUILD_CLANG_VERSION" ]
then
"clang-${BUILD_CLANG_VERSION}" --version | head -n1
if ! update-alternatives --list clang
then
update-alternatives --list "clang-${BUILD_CLANG_VERSION}"
fi
else
gcc --version | head -n1
if ! update-alternatives --list gcc
then
update-alternatives --list "gcc-${BUILD_GCC_VERSION}"
fi
fi
echo ""
echo "total ${total_error_count} error(s) ${total_warning_count} warning(s) :"
echo "|Count|Warning Group (-j build log inaccuracies)|"
echo "|--:|:--|"
# due to -j build the log lines might get corrupted, so missing/incorrect/bogus entries might be seen
# so we add extra: egrep "\[\-W.*\]" (to try to remove that)
sed -e 's#.*\(\[\-W\)#\1#' -e 's#\(\]\).*$#\1#' MAKE_warning.LOG | egrep "\[\-W.*\]" | sort | uniq -c | sort -n | tr -s ' ' | tr ' ' '|' | awk '{print $0"|"}'
echo ""
sed -e '0,/Configuration Summary/d' -e '/\---/,//d' CONFIGURE.LOG | egrep "^.*:"
echo ""
grep DCAD_DIR MAKE.LOG | tail -n1
) >> $GITHUB_STEP_SUMMARY

View File

@ -1,23 +0,0 @@
# CI for native ARM64 Linux build.
name: CI-aarch64
on:
push:
pull_request:
workflow_dispatch:
jobs:
simple_build_linux_arm:
runs-on: ubuntu-24.04-arm
steps:
- uses: actions/checkout@v4
- name: Get Dependencies
run: |
sudo apt-get update
sudo apt-get install -y tcl-dev tk-dev libcairo-dev
- name: Build
run: |
./configure
make database/database.h
make -j$(nproc)

View File

@ -1,475 +0,0 @@
# This is a basic workflow to help you get started with Actions
name: CI-macos
# Controls when the workflow will run
on:
push:
pull_request:
workflow_dispatch:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
simple_build_macos15:
runs-on: macos-15-intel # only and last supported intel MacOS
timeout-minutes: 45 # x86_64 seems non-SSD based (slower)
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Get Dependencies
shell: bash # default shell has unwanted broken pipe indication
run: |
brew install --cask xquartz
PACKAGE_LIST="xquartz"
brew install cairo tcl-tk@8 tcsh gnu-sed
_package_list="cairo tcl-tk@8 tcsh gnu-sed"
# These seem needed maybe they are being provided from somewhere else GHA runner
# or brew transitive depend either way doesn't hurt to confirm they are installed.
_package_list="$_package_list libglu freeglut"
if [ -n "$PACKAGE_LIST" ]
then
brew install $PACKAGE_LIST
fi
PACKAGE_LIST="$PACKAGE_LIST $_package_list"
echo "PACKAGE_LIST=$PACKAGE_LIST" >> $GITHUB_ENV
echo "UNAME_M=$(uname -m)" >> $GITHUB_ENV
set +e
set +o pipefail # macosx this is on by default (turn it off)
(
echo "### $(uname -s) $(uname -m) $(uname -r)"
echo ""
set +e
set +o pipefail # macosx this is on by default (turn it off)
export HOMEBREW_NO_COLOR=true
export HOMEBREW_NO_EMOKI=true
# output to $TMPFILE first, then head, instead of using pipeline directly
# this removes unwanted GHA SIGPIPE error/warning indicators from GHA logs
# brew maybe a nodejs command which has a known issue in this area on macosx
TMPFILE=/tmp/shell0$$.tmp
brew info xquartz > $TMPFILE && head -n1 $TMPFILE
brew info cairo > $TMPFILE && head -n1 $TMPFILE
brew info libglu > $TMPFILE && head -n1 $TMPFILE
brew info freeglut > $TMPFILE && head -n1 $TMPFILE
brew info tcl-tk > $TMPFILE && head -n1 $TMPFILE
brew info tcl-tk@8 > $TMPFILE && head -n1 $TMPFILE
brew info tcsh > $TMPFILE && head -n1 $TMPFILE
brew info gnu-sed > $TMPFILE && head -n1 $TMPFILE
echo ""
cc -v 2>&1
echo ""
xcodebuild -version
echo ""
xcodebuild -showsdks | grep macOS
) >> $GITHUB_STEP_SUMMARY
- name: Search
run: |
set +e
( # designed to speed up this process in a single scan
echo "#!/bin/sh"
echo "echo \$*"
echo "ls -ld -- \$*"
echo "shasum -a 1 \$* </dev/null"
echo "echo \"\""
echo "exit 0"
) > search.sh
echo "=== search.sh"
cat search.sh
chmod a+x search.sh
find /opt /usr $HOME \( -iname "libX11.*dylib" -or -iname "Xlib.h" -or -iname "libtcl*dylib" -or -iname "tcl.h" \) -exec ./search.sh {} \; 2>/dev/null
#
# Example symbols that were found missing from the tcl-tk X11 implementation
#find /opt /usr $HOME -iname "x*.h" -exec grep -Hn "XCreateGC" {} \; 2>/dev/null || true
#find /opt /usr $HOME -iname "x*.h" -exec grep -Hn "XGetVisualInfo" {} \; 2>/dev/null || true
#for i in /usr/X11/include/X11/Xlib.h /opt/X11/include/X11/Xlib.h /usr/local/include/X11/Xlib.h;
#do
# echo "====== $i"
# head -n 50 "$i"
# echo "==="
# tail -n 50 "$i"
# echo "======"
#done
# Different GHA platforms have different layouts (x86_64/arm64)
echo "=== /opt"
ls -l /opt
if [ -d /opt/homebrew ]
then
echo "=== /opt/homebrew"
ls -l /opt/homebrew
fi
echo "=== /usr/local/opt"
ls -l /usr/local/opt
echo "=== /usr/local/opt/runner"
ls -l /usr/local/opt/runner
echo "Done"
- name: Build
run: |
export PATH="/opt/X11/bin:$PATH"
./scripts/configure_mac 2>&1 | tee CONFIGURE.LOG
config_log=""
if [ -f scripts/config.log ]
then
config_log="scripts/config.log"
elif [ -f build-magic/config.log ]
then
config_log="build-magic/config.log"
fi
if [ -n "$config_log" ]
then
CONFIGURE_ARGS=$(head -n 10 $config_log | egrep "./configure" | sed -e 's#^ *\$ ##' -e 's#./configure ##')
echo "CONFIGURE_ARGS=$CONFIGURE_ARGS" >> $GITHUB_ENV
fi
echo "===== defs.mak ====="
cat defs.mak
echo "===== defs.mak ====="
make database/database.h
make -j$(sysctl -n hw.ncpu) 2>&1 | tee MAKE.LOG
- name: Install
run: |
sudo make install
- name: Kick The Tyres
run: |
set +e
echo "=== ls -l"
ls -l
find . -type f \( -name "*.dylib" -or -name "magic" -or -name "magicexec" -or -name "magicdnull" \)
echo "=== find /usr/local/bin"
find /usr/local/bin -mtime 0
echo "=== find /usr/local/share"
find /usr/local/share -mtime 0
echo "=== find /usr/local/lib/magic"
find /usr/local/lib/magic -mtime 0
echo "=== otool -L magic/tclmagic.dylib"
otool -L magic/tclmagic.dylib
echo "=== otool -L tcltk/magicexec"
otool -L tcltk/magicexec
echo "=== otool -L tcltk/magicdnull"
otool -L tcltk/magicdnull
set +o pipefail # macosx this is on by default (turn it off)
echo "=== magic --version"
magic --version
echo "=== magic -d help -noconsole"
magic -d help -noconsole
echo "=== magic -d null -noconsole -nowindow -T scmos"
echo "version ; quit" | magic -d null -noconsole -nowindow -T scmos
echo "=== magic -d null -noconsole -T scmos"
echo "version ; quit" | magic -d null -noconsole -T scmos
- name: Summary
if: always()
run: |
set +e
ls -l
touch MAKE.LOG # just in case it did not even build
grep "error:" MAKE.LOG > MAKE_error.LOG
grep "warning:" MAKE.LOG > MAKE_warning.LOG
# Less important warnings relating to codesmell more than security (filter out of headline)
grep -v "Wunused-variable" MAKE_warning.LOG |
grep -v "Wunused-local-typedefs" |
grep -v "Wunused-label" |
grep -v "Wunused-but-set-variable" > MAKE_warning_filtered.LOG
wc -l *.LOG
error_count=$( grep -c "error:" MAKE_error.LOG)
filtered_warning_count=$(grep -c "warning:" MAKE_warning_filtered.LOG)
title="### $(cat VERSION) ${MATRIX_OS} ${MATRIX_TC} ${MATRIX_PKGS} :: "
if [ "$error_count" -gt 0 ]
then
title="$title $error_count error(s)"
fi
if [ "$filtered_warning_count" -gt 0 ]
then
title="$title $filtered_warning_count warning(s)"
fi
(
total_error_count=$( wc -l MAKE_error.LOG | cut -d' ' -f1)
total_warning_count=$(wc -l MAKE_warning.LOG | cut -d' ' -f1)
echo "---"
echo "$title"
echo ""
[ -f scripts/config.log ] && grep "./configure" scripts/config.log | head -n1
echo ""
echo "PACKAGE_LIST=$PACKAGE_LIST"
echo "CONFIGURE_ARGS=$CONFIGURE_ARGS"
echo ""
if [ -s MAKE.LOG ]
then
echo "total ${total_error_count} error(s) ${total_warning_count} warning(s) :"
echo "|Count|Warning Group (-j build log inaccuracies)|"
echo "|--:|:--|"
# due to -j build the log lines might get corrupted, so missing/incorrect/bogus entries might be seen
# so we add extra: egrep "\[\-W.*\]" (to try to remove that)
sed -e 's#.*\(\[\-W\)#\1#' -e 's#\(\]\).*$#\1#' MAKE_warning.LOG | egrep "\[\-W.*\]" | sort | uniq -c | sort -n | tr -s ' ' | tr ' ' '|' | awk '{print $0"|"}'
echo ""
fi
grep -A100 "Configuration Summary" CONFIGURE.LOG | grep -v "Configuration Summary" | egrep "^.*:" | sed -e '/\---/,//d'
echo ""
grep DCAD_DIR MAKE.LOG | tail -n1
) >> $GITHUB_STEP_SUMMARY
- name: Prepare archive
run: |
mkdir -p dist
make install "DESTDIR=$(pwd)/dist"
# Diagnostic details about this build
mkdir -p dist/BUILD-INFO
set +e
cp */config.log dist/BUILD-INFO/
cp *.mak dist/BUILD-INFO/
cp *.LOG dist/BUILD-INFO/
- name: Upload archive magic-macos15
uses: actions/upload-artifact@v4
with:
name: magic-macos15
path: |
${{ github.workspace }}/dist
simple_build_macos:
runs-on: macos-latest
timeout-minutes: 30 # arm64 seems SSD based (faster)
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Get Dependencies
shell: bash # default shell has unwanted broken pipe indication
run: |
brew install --cask xquartz
PACKAGE_LIST="xquartz"
brew install cairo tcl-tk@8 tcsh gnu-sed
_package_list="cairo tcl-tk@8 tcsh gnu-sed"
# These seem needed maybe they are being provided from somewhere else GHA runner
# or brew transitive depend either way doesn't hurt to confirm they are installed.
_package_list="$_package_list libglu freeglut"
if [ -n "$PACKAGE_LIST" ]
then
brew install $PACKAGE_LIST
fi
PACKAGE_LIST="$PACKAGE_LIST $_package_list"
echo "PACKAGE_LIST=$PACKAGE_LIST" >> $GITHUB_ENV
echo "UNAME_M=$(uname -m)" >> $GITHUB_ENV
set +e
set +o pipefail # macosx this is on by default (turn it off)
(
echo "### $(uname -s) $(uname -m) $(uname -r)"
echo ""
set +e
set +o pipefail # macosx this is on by default (turn it off)
export HOMEBREW_NO_COLOR=true
export HOMEBREW_NO_EMOKI=true
# output to $TMPFILE first, then head, instead of using pipeline directly
# this removes unwanted GHA SIGPIPE error/warning indicators from GHA logs
# brew maybe a nodejs command which has a known issue in this area on macosx
TMPFILE=/tmp/shell0$$.tmp
brew info xquartz > $TMPFILE && head -n1 $TMPFILE
brew info cairo > $TMPFILE && head -n1 $TMPFILE
brew info libglu > $TMPFILE && head -n1 $TMPFILE
brew info freeglut > $TMPFILE && head -n1 $TMPFILE
brew info tcl-tk > $TMPFILE && head -n1 $TMPFILE
brew info tcl-tk@8 > $TMPFILE && head -n1 $TMPFILE
brew info tcsh > $TMPFILE && head -n1 $TMPFILE
brew info gnu-sed > $TMPFILE && head -n1 $TMPFILE
echo ""
cc -v 2>&1
echo ""
xcodebuild -version
echo ""
xcodebuild -showsdks | grep macOS
) >> $GITHUB_STEP_SUMMARY
- name: Search
run: |
set +e
( # designed to speed up this process in a single scan
echo "#!/bin/sh"
echo "echo \$*"
echo "ls -ld -- \$*"
echo "shasum -a 1 \$* </dev/null"
echo "echo \"\""
echo "exit 0"
) > search.sh
echo "=== search.sh"
cat search.sh
chmod a+x search.sh
find /opt /usr $HOME \( -iname "libX11.*dylib" -or -iname "Xlib.h" -or -iname "libtcl*dylib" -or -iname "tcl.h" \) -exec ./search.sh {} \; 2>/dev/null
#
# Example symbols that were found missing from the tcl-tk X11 implementation
#find /opt /usr $HOME -iname "x*.h" -exec grep -Hn "XCreateGC" {} \; 2>/dev/null || true
#find /opt /usr $HOME -iname "x*.h" -exec grep -Hn "XGetVisualInfo" {} \; 2>/dev/null || true
#for i in /usr/X11/include/X11/Xlib.h /opt/X11/include/X11/Xlib.h /usr/local/include/X11/Xlib.h;
#do
# echo "====== $i"
# head -n 50 "$i"
# echo "==="
# tail -n 50 "$i"
# echo "======"
#done
# Different GHA platforms have different layouts (x86_64/arm64)
echo "=== /opt"
ls -l /opt
if [ -d /opt/homebrew ]
then
echo "=== /opt/homebrew"
ls -l /opt/homebrew
fi
echo "=== /usr/local/opt"
ls -l /usr/local/opt
echo "=== /usr/local/opt/runner"
ls -l /usr/local/opt/runner
echo "Done"
- name: Build
run: |
export PATH="/opt/X11/bin:$PATH"
./scripts/configure_mac 2>&1 | tee CONFIGURE.LOG
config_log=""
if [ -f scripts/config.log ]
then
config_log="scripts/config.log"
elif [ -f build-magic/config.log ]
then
config_log="build-magic/config.log"
fi
if [ -n "$config_log" ]
then
CONFIGURE_ARGS=$(head -n 10 $config_log | egrep "./configure" | sed -e 's#^ *\$ ##' -e 's#./configure ##')
echo "CONFIGURE_ARGS=$CONFIGURE_ARGS" >> $GITHUB_ENV
fi
echo "===== defs.mak ====="
cat defs.mak
echo "===== defs.mak ====="
make database/database.h
make -j$(sysctl -n hw.ncpu) 2>&1 | tee MAKE.LOG
- name: Install
run: |
sudo make install
- name: Kick The Tyres
run: |
set +e
echo "=== ls -l"
ls -l
find . -type f \( -name "*.dylib" -or -name "magic" -or -name "magicexec" -or -name "magicdnull" \)
echo "=== find /usr/local/bin"
find /usr/local/bin -mtime 0
echo "=== find /usr/local/share"
find /usr/local/share -mtime 0
echo "=== find /usr/local/lib/magic"
find /usr/local/lib/magic -mtime 0
echo "=== otool -L magic/tclmagic.dylib"
otool -L magic/tclmagic.dylib
echo "=== otool -L tcltk/magicexec"
otool -L tcltk/magicexec
echo "=== otool -L tcltk/magicdnull"
otool -L tcltk/magicdnull
set +o pipefail # macosx this is on by default (turn it off)
echo "=== magic --version"
magic --version
echo "=== magic -d help -noconsole"
magic -d help -noconsole
echo "=== magic -d null -noconsole -nowindow -T scmos"
echo "version ; quit" | magic -d null -noconsole -nowindow -T scmos
echo "=== magic -d null -noconsole -T scmos"
echo "version ; quit" | magic -d null -noconsole -T scmos
- name: Summary
if: always()
run: |
set +e
ls -l
touch MAKE.LOG # just in case it did not even build
grep "error:" MAKE.LOG > MAKE_error.LOG
grep "warning:" MAKE.LOG > MAKE_warning.LOG
# Less important warnings relating to codesmell more than security (filter out of headline)
grep -v "Wunused-variable" MAKE_warning.LOG |
grep -v "Wunused-local-typedefs" |
grep -v "Wunused-label" |
grep -v "Wunused-but-set-variable" > MAKE_warning_filtered.LOG
wc -l *.LOG
error_count=$( grep -c "error:" MAKE_error.LOG)
filtered_warning_count=$(grep -c "warning:" MAKE_warning_filtered.LOG)
title="### $(cat VERSION) ${MATRIX_OS} ${MATRIX_TC} ${MATRIX_PKGS} :: "
if [ "$error_count" -gt 0 ]
then
title="$title $error_count error(s)"
fi
if [ "$filtered_warning_count" -gt 0 ]
then
title="$title $filtered_warning_count warning(s)"
fi
(
total_error_count=$( wc -l MAKE_error.LOG | cut -d' ' -f1)
total_warning_count=$(wc -l MAKE_warning.LOG | cut -d' ' -f1)
echo "---"
echo "$title"
echo ""
[ -f scripts/config.log ] && grep "./configure" scripts/config.log | head -n1
echo ""
echo "PACKAGE_LIST=$PACKAGE_LIST"
echo "CONFIGURE_ARGS=$CONFIGURE_ARGS"
echo ""
if [ -s MAKE.LOG ]
then
echo "total ${total_error_count} error(s) ${total_warning_count} warning(s) :"
echo "|Count|Warning Group (-j build log inaccuracies)|"
echo "|--:|:--|"
# due to -j build the log lines might get corrupted, so missing/incorrect/bogus entries might be seen
# so we add extra: egrep "\[\-W.*\]" (to try to remove that)
sed -e 's#.*\(\[\-W\)#\1#' -e 's#\(\]\).*$#\1#' MAKE_warning.LOG | egrep "\[\-W.*\]" | sort | uniq -c | sort -n | tr -s ' ' | tr ' ' '|' | awk '{print $0"|"}'
echo ""
fi
grep -A100 "Configuration Summary" CONFIGURE.LOG | grep -v "Configuration Summary" | egrep "^.*:" | sed -e '/\---/,//d'
echo ""
grep DCAD_DIR MAKE.LOG | tail -n1
) >> $GITHUB_STEP_SUMMARY
- name: Prepare archive
run: |
mkdir -p dist
make install "DESTDIR=$(pwd)/dist"
# Diagnostic details about this build
mkdir -p dist/BUILD-INFO
set +e
cp */config.log dist/BUILD-INFO/
cp *.mak dist/BUILD-INFO/
cp *.LOG dist/BUILD-INFO/
- name: Upload archive magic-macos
uses: actions/upload-artifact@v4
with:
name: magic-macos
path: |
${{ github.workspace }}/dist

View File

@ -1,160 +0,0 @@
name: CI-wasm
# Builds the Magic WebAssembly target on every push and pull request.
# When the VERSION file changes on the default branch, the package is
# additionally published to GitHub Packages (npm.pkg.github.com) as
# @<owner>/magic-vlsi-wasm — no manual tag or token required.
# Tim Edwards updates VERSION to trigger a new release; the scope resolves
# automatically to the repo owner, so forks publish under their own namespace.
#
# WASM is architecture-independent — built once on x86-64, usable everywhere.
on:
push:
pull_request:
workflow_dispatch:
inputs:
emsdk_version:
description: 'emsdk version to build with (default: latest; pin a version number to bisect)'
type: string
default: 'latest'
dry_run:
description: 'Dry run: pack only, do not publish even on tag pushes'
type: boolean
default: true
# actions/upload-artifact@v5 still runs on Node.js 20. Force Node 24 to
# silence the deprecation warning until upload-artifact ships a Node-24
# release. Drop this once upgraded.
env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
permissions:
contents: read
packages: write
jobs:
build-wasm:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
with:
fetch-depth: 2
- name: Set up Node.js
uses: actions/setup-node@v5
with:
node-version: '22'
registry-url: 'https://npm.pkg.github.com'
- name: Install emsdk
env:
# Defaults to latest so CI tracks emsdk HEAD and catches breakage early.
# Override via workflow_dispatch to pin a specific version when needed
# (e.g. to bisect a regression or verify a post-build.sh patch still applies).
EMSDK_VERSION: ${{ github.event.inputs.emsdk_version || 'latest' }}
run: |
git clone https://github.com/emscripten-core/emsdk.git
cd emsdk
./emsdk install "$EMSDK_VERSION"
./emsdk activate "$EMSDK_VERSION"
# Dump native + emscripten preprocessor defines. Useful for diagnosing
# WASM-build differences after an emsdk bump.
- name: Emscripten Diagnostic
run: |
source ./emsdk/emsdk_env.sh
echo "===== gcc -dM -E - ====="; echo | gcc -dM -E - | sort
echo "===== g++ -dM -E - ====="; echo | g++ -dM -E - | sort
echo "===== emcc -dM -E - ====="; echo | emcc -dM -E - | sort
echo "===== em++ -dM -E - ====="; echo | em++ -dM -E - | sort
- name: Build WASM
run: |
source ./emsdk/emsdk_env.sh
# --without/--disable flags: no WASM library available for these features
CFLAGS="--std=c17 -D_DEFAULT_SOURCE=1 -DEMSCRIPTEN=1" emconfigure ./configure \
--without-cairo --without-opengl --without-x --without-tk --without-tcl \
--disable-readline --disable-compression \
--host=asmjs-unknown-emscripten \
--target=asmjs-unknown-emscripten
# Append WASM linker flags and activate the WASM link target
cat toolchains/emscripten/defs.mak >> defs.mak
# Echo the merged defs.mak so CI logs show the exact build config
echo "===== defs.mak ====="; cat defs.mak; echo "===== defs.mak ====="
# Build in order: techs must exist before mains (--embed-file embeds them)
emmake make depend
emmake make -j$(nproc) modules libs
emmake make techs
emmake make mains
- name: Copy WASM artifacts into npm/
run: |
cp magic/magic.js npm/
cp magic/magic.wasm npm/
- name: Run example tests
run: cd npm && npm run test
# Dump generated text outputs (.ext, .spice, .cif, …) into the CI log
# so a regression in extraction / netlisting / cifoutput is visible
# without having to download artifacts. The .gds output is binary —
# skip it and just record its size.
- name: Display example outputs
run: |
shopt -s nullglob
for f in npm/examples/output/*; do
name=$(basename "$f")
case "$f" in
*.gds) echo "===== $name (binary, $(wc -c < "$f") bytes — skipped) =====" ;;
*) echo "===== $name ====="; cat "$f" ;;
esac
done
- name: Set package version and scope
run: |
base=$(cat VERSION) # e.g. 8.3.637
date=$(git show -s --format=%cs | tr -d '-') # e.g. 20260414
hash=$(git show -s --format=%h) # e.g. d157eea
VERSION="${base}-${date}.${hash}"
# Scope the package to the repo owner so it lands in the right
# GitHub Packages namespace regardless of who hosts the repo.
# e.g. @rtimothyedwards/magic-vlsi-wasm on Tim's repo,
# @intubun/magic-vlsi-wasm on a fork.
SCOPED_NAME="@${{ github.repository_owner }}/magic-vlsi-wasm"
cd npm
npm pkg set name="$SCOPED_NAME"
npm pkg set publishConfig.registry="https://npm.pkg.github.com"
npm version "$VERSION" --no-git-tag-version
- name: Pack
run: ./npm/pack.sh
- name: Upload tarball as artifact
uses: actions/upload-artifact@v5
with:
name: magic-vlsi-wasm-npm
path: npm/*.tgz
- name: Check if VERSION changed
id: version_changed
if: github.event_name == 'push'
run: |
if echo "${{ github.ref }}" | grep -q '^refs/tags/'; then
echo "changed=true" >> $GITHUB_OUTPUT
elif [ "${{ github.ref }}" = "refs/heads/${{ github.event.repository.default_branch }}" ]; then
if git diff --name-only HEAD~1 HEAD 2>/dev/null | grep -q '^VERSION$'; then
echo "changed=true" >> $GITHUB_OUTPUT
else
echo "changed=false" >> $GITHUB_OUTPUT
fi
else
echo "changed=false" >> $GITHUB_OUTPUT
fi
- name: Publish to GitHub Packages
if: steps.version_changed.outputs.changed == 'true' && github.event.inputs.dry_run != 'true'
run: cd npm && npm publish
env:
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@ -1,21 +1,51 @@
# This is a basic workflow to help you get started with Actions
name: CI
# Controls when the workflow will run
on:
push:
pull_request:
workflow_dispatch:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
simple_build_linux:
vezzal:
# The type of runner that the job will run on
runs-on: ubuntu-latest
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
- uses: actions/checkout@v5
- name: Pulling the docker image
run: docker pull vezzal/vezzal:v1
- name: Start the container with the docker image
run: docker run -id --name test_magic vezzal/vezzal:v1 bash | exit
- name: Run the testing on the container and send the mail
run: docker exec test_magic /vezzal/test_magic.sh "lankasaicharan123@gmail.com,tim@opencircuitdesign.com" ${{secrets.MAILING_KEY}}
simple_build_linux:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- name: Get Dependencies
run: |
sudo apt-get update
sudo apt-get install -y tcl-dev tk-dev libcairo-dev
sudo apt-get install -y tcl-dev tk-dev libcairo-dev csh
- name: Build
run: |
./configure
make database/database.h
make -j$(nproc)
# simple_build_mac:
# runs-on: macos-11
# steps:
# - uses: actions/checkout@v2
# - name: Get Dependencies
# run: |
# brew install --cask xquartz
# brew install cairo tcl-tk tcsh
# - name: Build
# run: |
# export PATH="/opt/X11/bin:$PATH"
# ./scripts/configure_mac
# make database/database.h
# make -j$(sysctl -n hw.ncpu)

48
.gitignore vendored
View File

@ -1,33 +1,20 @@
# Autoconf / configure outputs
defs.mak
!toolchains/emscripten/defs.mak
*/Depend
config.cache
config.log
scripts/config.log
scripts/config.status
scripts/defs.mak
install.log
make.log
reconfigure.sh
# Compiled objects / libraries
*.o
*.a
*.so
*/Depend
database/database.h
# Editor / OS cruft
.*.swp
.*.swo
*.o
*.so
*~
.DS_Store
.vscode/
.idea/
# Magic runtime-generated files
magic/proto.magicrc
scmos/cif_template/objs/*
database/database.h
install.log
magic/proto.magicrc
make.log
readline/readline
scmos/gdsquery.tech
scmos/minimum.tech
scmos/scmos-sub.tech
@ -35,28 +22,13 @@ scmos/scmos-tm.tech
scmos/scmos.tech
scmos/scmosWR.tech
scmos/nmos.tech
# Native build artifacts
magic/magic
magic/tclmagic.dylib
tcltk/magic.sh
tcltk/magic.tcl
tcltk/magicdnull
tcltk/magicexec
tcltk/ext2spice.sh
tcltk/ext2sim.sh
magic/tclmagic.dylib
tcltk/magicdnull.dSYM/
tcltk/magicexec.dSYM/
pfx/
# WASM build artifacts
magic/magic.js
magic/magic.js.symbols
magic/magic.symbols
magic/magic.wasm
net2ir/net2ir
net2ir/net2ir.js
net2ir/net2ir.wasm
# Generated test output
npm/examples/output/
reconfigure.sh

View File

@ -47,12 +47,6 @@ Autoconf Capsule Summary:
Disable threaded X11 and OpenGL graphics.
Normally enabled.
--disable-compression
Disable reading and writing of compressed
(gzipped) GDS files and reading of compressed
.mag files. Normally enabled, if the zlib
development package is installed.
Notes to Magic maintainers:
--------------------------

View File

@ -3,10 +3,9 @@
Get [Homebrew](https://brew.sh).
```sh
brew install cairo tcl-tk@8 python3 gnu-sed
brew install cairo tcl-tk tcsh
brew install --cask xquartz
./scripts/configure_mac
# If you have both TCL8 and TCL9 installed you may need to verify which was selected.
make database/database.h
make -j$(sysctl -n hw.ncpu)
make install # may need sudo depending on your setup
@ -23,7 +22,6 @@ We are following the instructions from xschem (https://github.com/StefanSchipper
We are using not `opt` but `opt2` so that this Tcl does not interfere with `tcl-tk` from HomeBrew.
Extract the Tcl sources and then go to the unix folder and execute the following commands::
```
./configure --prefix=/usr/local/opt2/tcl-tk
make
@ -34,13 +32,6 @@ make install
* Download Tk from https://prdownloads.sourceforge.net/tcl/tk8.6.10-src.tar.gz
Extract Tk source and then go to the unix folder:
NOTE: before running 'make' inspect the Makefile and ensure the LIB_RUNTIME_DIR is set as follows. Make the correction if not:
```
LIB_RUNTIME_DIR = $(libdir)
```
```
./configure --prefix=/usr/local/opt2/tcl-tk \
--with-tcl=/usr/local/opt2/tcl-tk/lib --with-x \
@ -62,18 +53,3 @@ CFLAGS=-Wno-error=implicit-function-declaration
make
make install
```
## If facing issue with layout window not opening / XQuartz:
Make sure that the output of the following command is ```:0```.
```
echo $DISPLAY
```
if the above command doesn't display ```:0``` then add the following line in ```.zshrc```.
```
export PATH="/opt/X11/bin:$PATH"
```
Close & reopen terminal to load the path. Then set display manually to ```0``` by using the following command.
```
export DISPLAY=:0
```
Now ```echo DISPLAY``` should give ```:0``` as output.

104
Makefile
View File

@ -4,33 +4,31 @@
MAGICDIR = .
PROGRAMS = magic
TECHS = scmos
TECH = scmos
LIBRARIES = database utils extflat
MODULES = bplane cmwind commands database dbwind debug drc extflat \
extract graphics netmenu plow resis select sim textio tiles \
utils windows wiring
# This was `cat VERSION`
VERSION := $(shell cat ${MAGICDIR}/VERSION)
MAKEFLAGS =
INSTALL_CAD_DIRS = windows doc ${TECHS}
INSTALL_CAD_DIRS = windows doc ${TECH}
-include defs.mak
all: $(ALL_TARGET) techs
all: $(ALL_TARGET)
standard: mains
standard:
@echo --- errors and warnings logged in file make.log
@${MAKE} mains
tcl: tcllibrary
tcl:
@echo --- errors and warnings logged in file make.log
@${MAKE} tcllibrary
force:
@${MAKE} clean
@${MAKE} all
force: clean all
defs.mak:
@echo No \"defs.mak\" file found. Run "configure" to make one.
@exit 1
config:
${MAGICDIR}/configure
@ -45,56 +43,25 @@ mains: database/database.h modules libs
for dir in ${PROGRAMS}; do \
(cd $$dir && ${MAKE} main) || exit 1; done
database/database.h: ${MAGICDIR}/database/database.h.in
database/database.h: database/database.h.in
@echo --- making header file database/database.h
${SCRIPTS}/makedbh ${MAGICDIR}/database/database.h.in database/database.h
${SCRIPTS}/makedbh database/database.h.in database/database.h
# tiles xyz => tiles/libtiles.o xyz/libxyz.o
MODULES_SUBDIR := $(shell for i in ${MODULES}; do echo "$${i}/lib$${i}.o"; done)
# tiles xyz => tiles/libtiles.a xyz/libxyz.a
LIBS_SUBDIR := $(shell for i in ${MODULES}; do echo "$${i}/lib$${i}.a"; done)
modules: database/database.h depend
@echo --- making modules
for dir in ${MODULES} ${PROGRAMS}; do \
(cd $$dir && ${MAKE} module) || exit 1; done
.PHONY: FORCE
${MODULES_SUBDIR}: FORCE
@${MAKE} -C $(dir $@) module
libs:
@echo --- making libraries
for dir in ${LIBRARIES}; do \
(cd $$dir && ${MAKE} lib) || exit 1; done
.PHONY: modules
modules: database/database.h depend ${MODULES_SUBDIR}
${LIBS_SUBDIR}: FORCE
@${MAKE} -C $(dir $@) lib
# Force the tiles/utils modules to exist first for libdatabase.a
.PHONY: libs
libs: database/database.h depend tiles/libtiles.o utils/libutils.o ${LIBS_SUBDIR}
#
# extcheck - utility tool
# net2ir - utility tool
# oa - disabled (needs 'clean' target renaming)
SUBDIRS = bplane cmwind commands database dbwind debug drc extflat extract graphics \
magic netmenu plow resis select sim textio tiles utils windows wiring
BUNDLED_MODULES = readline lisp
# Unique list of all subdir that might have Depend file, we have to deduplicate otherwise
# MAKE will warning loudly. This list is somewhat empty when defs.mak does not exist
SUBDIRS_FILTERED := $(shell echo ${MODULES} ${PROGRAMS} ${SUBDIRS} | tr ' ' '\n' | sort | uniq)
SUBDIRS_DEPEND = $(addsuffix /Depend, ${SUBDIRS_FILTERED})
${SUBDIRS_DEPEND}: database/database.h
depend: database/database.h
@echo --- making dependencies
${MAKE} -C $(dir $@) depend
.PHONY: depend
depend: defs.mak ${SUBDIRS_DEPEND}
.PHONY: techs
techs: depend
@echo --- making techs
for dir in ${TECHS}; do \
(cd $$dir && ${MAKE} all) || exit 1; done
${RM} */Depend
for dir in ${MODULES} ${UNUSED_MODULES} ${PROGRAMS}; do \
(cd $$dir && ${MAKE} depend) || exit 1; done
install: $(INSTALL_TARGET)
@ -129,7 +96,7 @@ install-tcl-real: install-tcl-dirs
(cd $$dir && ${MAKE} install-tcl); done
clean:
for dir in ${SUBDIRS_FILTERED} ${TECHS} ${BUNDLED_MODULES}; do \
for dir in ${MODULES} ${PROGRAMS} ${TECH} ${UNUSED_MODULES}; do \
(cd $$dir && ${MAKE} clean); done
${RM} *.tmp */*.tmp *.sav */*.sav *.log TAGS tags
@ -139,19 +106,18 @@ distclean:
${RM} defs.mak old.defs.mak ${MAGICDIR}/scripts/defs.mak
${RM} ${MAGICDIR}/scripts/default.conf
${RM} ${MAGICDIR}/scripts/config.log ${MAGICDIR}/scripts/config.status
${RM} database/database.h
${RM} scripts/magic.spec magic-${VERSION} magic-${VERSION}.tgz
${RM} *.log
${RM} scripts/magic.spec magic-`cat VERSION` magic-`cat VERSION`.tgz
${RM} *.log */Depend
dist:
${RM} scripts/magic.spec magic-${VERSION} magic-${VERSION}.tgz
${SED} -e /@VERSION@/s%@VERSION@%${VERSION}% \
${RM} scripts/magic.spec magic-`cat VERSION` magic-`cat VERSION`.tgz
sed -e /@VERSION@/s%@VERSION@%`cat VERSION`% \
scripts/magic.spec.in > scripts/magic.spec
${LN} -nsf . magic-${VERSION}
tar zchvf magic-${VERSION}.tgz --exclude CVS \
--exclude magic-${VERSION}/magic-${VERSION} \
--exclude magic-${VERSION}/magic-${VERSION}.tgz \
magic-${VERSION}
ln -nsf . magic-`cat VERSION`
tar zchvf magic-`cat VERSION`.tgz --exclude CVS \
--exclude magic-`cat VERSION`/magic-`cat VERSION` \
--exclude magic-`cat VERSION`/magic-`cat VERSION`.tgz \
magic-`cat VERSION`
clean-mains:
for dir in ${PROGRAMS}; do \
@ -168,6 +134,6 @@ TAGS:
setup-git:
git config --local include.path ../.gitconfig
git stash save
${RM} .git/index
rm .git/index
git checkout HEAD -- "$$(git rev-parse --show-toplevel)"
git stash pop

View File

@ -1 +1 @@
8.3.660
8.3.382

View File

@ -1,59 +0,0 @@
FROM almalinux:10
USER root
# Build Dependencies (and dump version to logging)
RUN dnf install -y python3 zlib-devel ncurses-devel readline-devel cairo-devel freeglut-devel \
mesa-libGLU-devel mesa-libGL-devel libX11-devel libstdc++-devel gcc gcc-c++ make git tcsh \
zip \
&& echo "### rpm -qa:" \
&& rpm -qa | sort \
&& echo ""
#RUN dnf group install -y "Development Tools"
# Tcl/Tk
WORKDIR /tcl
RUN curl -L https://prdownloads.sourceforge.net/tcl/tcl9.0.1-src.tar.gz | tar --strip-components=1 -xzC . \
&& cd unix \
&& ./configure --prefix=/prefix \
&& make \
&& make install install-libraries install-msgs install-tzdata
WORKDIR /tk
RUN curl -L https://prdownloads.sourceforge.net/tcl/tk9.0.1-src.tar.gz | tar --strip-components=1 -xzC . \
&& cd unix \
&& ./configure --prefix=/prefix --with-tcl=/prefix/lib \
&& make \
&& make install install-libraries
WORKDIR /prefix/bin
RUN cp ./wish9.0 ./wish
RUN cp ./tclsh9.0 ./tclsh
# Magic
WORKDIR /magic
COPY . .
RUN ./configure \
--prefix=/prefix \
--with-tcl=/prefix/lib \
--with-tk=/prefix/lib \
&& make clean \
&& make database/database.h \
&& make -j$(nproc) \
&& make install
# Produce summary of what was created and confirm their DSOs
RUN echo "### filesystem:" \
find /prefix -printf "%y/%M/%m %i/%n %l %u/%U %g/%G %s/%b %T+/%T@\t%p\n"; \
ls -lR /prefix; \
find /prefix -type f -perm /111 -exec bash -c "echo \#\#\# {}; ldd -v {}" \; 2>/dev/null; \
for name in libgcc_s libstdc++ libpng liblzma libxml2 libz libcairo libGL libGLU; do \
find /lib64 /usr/lib64 -maxdepth 2 -name "*.so" -name "${name}*" -exec bash -c "echo \#\#\# {}; ldd -v {}" \; 2>/dev/null; \
done; \
echo "###"
WORKDIR /
RUN tar -czf /prefix.tar.gz -C ./prefix .
CMD ["/bin/bash"]

View File

@ -1,46 +0,0 @@
MAGIC_SRC_ROOT = ../..
RESOURCES := $(shell find ../rsc/ -type f)
ARCH := $(shell uname -m)
APPIMAGE = Magic-$(ARCH).AppImage
VERSION_MAGIC := $(shell cat $(MAGIC_SRC_ROOT)/VERSION)
VERSION_TSTAMP := $(shell git show -s "--format=%cs" | tr -d '-')
VERSION_HASH := $(shell git show -s "--format=%h")
VERSION_NUM ?= $(VERSION_MAGIC)~$(VERSION_TSTAMP)~$(VERSION_HASH)
VERSION := $(VERSION_NUM)
# Allow CI to override
APPIMAGETOOL_DOWNLOAD_URL ?= https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage
all: $(APPIMAGE)
.PHONY: prefix/bin/magic
prefix/bin/magic: Dockerfile Makefile
@echo "APPIMAGE=$(APPIMAGE)"
@echo "VERSION=$(VERSION)"
@echo "ARCH=$(ARCH)"
@echo "RESOURCES=$(RESOURCES)"
rm -rf prefix
docker build -t magic_build -f ./Dockerfile $(MAGIC_SRC_ROOT)
id=$$(docker create magic_build) ; \
docker cp $$id:/prefix ./prefix ; \
docker rm -v $$id
mkdir -p prefix/lib/tcl9.0.1
cp -r prefix/lib/tcl9.0 prefix/lib/tcl9.0.1/library
appimagetool:
curl -L "$(APPIMAGETOOL_DOWNLOAD_URL)" > ./appimagetool
chmod +x ./appimagetool
$(APPIMAGE): prefix/bin/magic appimagetool $(RESOURCES)
cp $(RESOURCES) ./prefix/
./appimagetool prefix
PREFIX ?= /usr/local
install:
install $(APPIMAGE) $(PREFIX)/bin/magic
.PHONY: clean
clean:
rm -f *.AppImage
rm -f prefix.tar.gz
rm -rf prefix

View File

@ -1,127 +0,0 @@
This is an AppImage that runs on all GNU/Linux platforms with:
* FUSE
* This excludes non-privileged Docker containers unfortunately, unless pre-extracted.
* GLIBC 2.38+
* Cairo 1.18+
* May require runtime CPU matching Linux ABI x86-64-v3 and newer (CPUs with SSE4.2/AVX2/BMI2/FMA via `lscpu`).
This AppImage build is based on EL10 (via AlmaLinux 10).
AlmaLinux 10 was first released on 27 May 2025.
# Version Info
See the AppImage main binary file naming, release tag information and AppInfo metadata
for the exact magic version inside the archive. When starting AppImage by default the
Tcl console banner can also provide version information, also using the `version` Tcl
command.
# Build Info
* Based on AlmaLinux 10 (EL10)
* Tcl/Tk 9.0.1
* and Magic 8.x
* all default modules enabled (including all Display drivers cairo/X11/OpenGL)
# FAQ: How to use
Download the *.AppImage file relevant to your platform and run:
```
chmod +x Magic-x86_64.AppImage
./Magic-x86_64.AppImage
```
Example startup with command line options:
```
./Magic-x86_64.AppImage -d XR -T scmos
```
# FAQ: How to use (inside docker / podman)
```
chmod +x Magic-x86_64.AppImage
### Podman or Docker, use :Z when rootless with selinux enabled
podman run --rm --device /dev/fuse --privileged \
-v "$(pwd):/tmp/work:Z" -v "/tmp/.X11-unix/X0:/tmp/.X11-unix/X0:Z" \
-e DISPLAY -ti almalinux:10
### Inside Docker:
dnf update -y
dnf install -y fuse libX11 cairo libGL libGLU
cd /tmp/work
./Magic-x86_64.AppImage -d XR -T scmos
```
# Building Requirements
* A reasonably recent GNU/Linux host
* GNU make
* Docker 20+
* Git
* curl
The final build is then packaged into an AppImage using AppImageTool on the host machine.
# Build Instructions
`make`
# Installation Instructions
`make install`
# FAQ: Is my CPU supported ?
This is built with the standard x86_64 Linux ABI version for AlmaLinux 10.
Use the command `/lib64/ld-linux-x86-64.so.2 --help` to see which CPUs your
Linux distribtion supports (and your CPU) look for the word "supported".
# FAQ: The DSO versioning link dependencies?
The information here provides an outline of what versions to expect from EL10
of the major dependencies, to assist you in a compatibility check with your
Linux distribution of choice.
The actual versions in our public releases can differ slightly inline with
the EL10 support compatibility and ABI versioning policies for the support
lifecycle of the distribution.
The most important items are the Direct Dependencies and the availabilty
of a suitable graphics DSO as per your '-d' choice.
Direct Runtime Dependencies (from /prefix/**):
| DSO Filename | DSO Symbol Version | Related Packages |
| :--------------------- | :------------------ | :------------------- |
| libc.so.6 | GLIBC_2.38 | glibc-2.39-37 |
| libz.so.1 | ZLIB_1.2.2 | zlib-ng-2.2.3-1 |
| | | zlib-ng-compat-2.2.3-1 |
Optional/Modular Runtime Dependencies (depending on graphics mode):
| DSO Filename | DSO Symbol Version | Related Packages |
| :--------------------- | :------------------ | :------------------- |
| libcairo.so.2 | | |
| libcairo.so.2.11802.0 | | cairo-1.18.2-2 |
| libGL.so.1 | | libglvnd-glx-1:1.7.0-7 |
| | | mesa-libGL-24.2.8-2 |
| libGLU.so.1 | | mesa-libGLU-9.0.3-7 |
Transitive/Third-Party Runtime Dependencies (for information only):
| DSO Filename | DSO Symbol Version | Related Packages |
| :--------------------- | :------------------ | :------------------- |
| libstdc++.so.6 | CXXABI_1.3.9 | gcc-c++-14.2.1-7 |
| libstdc++.so.6 | GLIBCXX_3.4 | gcc-c++-14.2.1-7 |
| libgcc_s.so.1 | GCC_4.2.0 | libgcc_s-14-20250110 |
| libxml2.so.2 | LIBXML2_2.6.0 | libxml2-2.12.5-5 |
| libpng16.so.16 | PNG16_0 | libpng-2:1.6.40-8 |
| liblzma.so.5 | XZ_5.0 | xz-devel-1:5.6.2-4 |
| libz.so.1 | ZLIB_1.2.9 | zlib-ng-2.2.3-1 |
| | | zlib-ng-compat-2.2.3-1 |

View File

@ -1,68 +0,0 @@
FROM centos/python-38-centos7:20210726-fad62e9
USER root
# CentOS7 went EOL on June 30, 2024 this builds out of vault.centos.org
RUN ls -l /etc/yum.repos.d/ \
&& cp /etc/yum.repos.d/CentOS-Base.repo /tmp/CentOS-Base.repo.old \
&& sed -e 's/mirror.centos.org/vault.centos.org/g' -i /etc/yum.repos.d/*.repo \
&& sed -e 's/^#.*baseurl=http/baseurl=http/g' -i /etc/yum.repos.d/*.repo \
&& sed -e 's/^mirrorlist=http/#mirrorlist=http/g' -i /etc/yum.repos.d/*.repo \
&& diff -u /tmp/CentOS-Base.repo.old /etc/yum.repos.d/CentOS-Base.repo; \
yum clean all \
&& yum -y update \
&& rm -f /tmp/CentOS-Base.repo.old
# Build Dependencies (and dump version to logging)
RUN yum install -y cairo-devel freeglut-devel gcc make tcsh \
&& echo "### rpm -qa:" \
&& rpm -qa | sort \
&& echo ""
# Tcl/Tk
WORKDIR /tcl
RUN curl -L https://prdownloads.sourceforge.net/tcl/tcl8.6.16-src.tar.gz | tar --strip-components=1 -xzC . \
&& cd unix \
&& ./configure --prefix=/prefix \
&& make \
&& make install
WORKDIR /tk
RUN curl -L https://prdownloads.sourceforge.net/tcl/tk8.6.16-src.tar.gz | tar --strip-components=1 -xzC . \
&& cd unix \
&& ./configure --prefix=/prefix --with-tcl=/prefix/lib \
&& make \
&& make install
WORKDIR /prefix/bin
RUN cp ./wish8.6 ./wish
RUN cp ./tclsh8.6 ./tclsh
# Magic
WORKDIR /magic
COPY . .
RUN ./configure \
--prefix=/prefix \
--with-tcl=/prefix/lib \
--with-tk=/prefix/lib \
--without-opengl \
&& make clean \
&& make database/database.h \
&& make -j$(nproc) \
&& make install
# Produce summary of what was created and confirm their DSOs
RUN echo "### filesystem:" \
find /prefix -printf "%y/%M/%m %i/%n %l %u/%U %g/%G %s/%b %T+/%T@\t%p\n"; \
ls -lR /prefix; \
find /prefix -type f -perm /111 -exec bash -c "echo \#\#\# {}; ldd -v {}" \; 2>/dev/null; \
for name in libgcc_s libstdc++ libpng liblzma libxml2 libz libcairo libGL libGLU; do \
find /lib64 /usr/lib64 -maxdepth 2 -name "*.so" -name "${name}*" -exec bash -c "echo \#\#\# {}; ldd -v {}" \; 2>/dev/null; \
done; \
echo "###"
WORKDIR /
RUN tar -czf /prefix.tar.gz -C ./prefix .
CMD ["/bin/bash"]

View File

@ -1,46 +0,0 @@
MAGIC_SRC_ROOT = ../..
RESOURCES := $(shell find ../rsc/ -type f)
ARCH := $(shell uname -m)
APPIMAGE = Magic-$(ARCH).AppImage
VERSION_MAGIC := $(shell cat $(MAGIC_SRC_ROOT)/VERSION)
VERSION_TSTAMP := $(shell git show -s "--format=%cs" | tr -d '-')
VERSION_HASH := $(shell git show -s "--format=%h")
VERSION_NUM ?= $(VERSION_MAGIC)~$(VERSION_TSTAMP)~$(VERSION_HASH)
VERSION := $(VERSION_NUM)
# Allow CI to override
APPIMAGETOOL_DOWNLOAD_URL ?= https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage
all: $(APPIMAGE)
.PHONY: prefix/bin/magic
prefix/bin/magic: Dockerfile Makefile
@echo "APPIMAGE=$(APPIMAGE)"
@echo "VERSION=$(VERSION)"
@echo "ARCH=$(ARCH)"
@echo "RESOURCES=$(RESOURCES)"
rm -rf prefix
docker build -t magic_build -f ./Dockerfile $(MAGIC_SRC_ROOT)
id=$$(docker create magic_build) ; \
docker cp $$id:/prefix ./prefix ; \
docker rm -v $$id
mkdir -p prefix/lib/tcl8.6.16
cp -r prefix/lib/tcl8.6 prefix/lib/tcl8.6.16/library
appimagetool:
curl -L "$(APPIMAGETOOL_DOWNLOAD_URL)" > ./appimagetool
chmod +x ./appimagetool
$(APPIMAGE): prefix/bin/magic appimagetool $(RESOURCES)
cp $(RESOURCES) ./prefix/
./appimagetool prefix
PREFIX ?= /usr/local
install:
install $(APPIMAGE) $(PREFIX)/bin/magic
.PHONY: clean
clean:
rm -f *.AppImage
rm -f prefix.tar.gz
rm -rf prefix

View File

@ -1,137 +0,0 @@
This is an AppImage that runs on all GNU/Linux platforms with:
* FUSE
* This excludes non-privileged Docker containers unfortunately, unless pre-extracted.
* GLIBC 2.17+
* Cairo 1.15+
* Supports all Linux x86_64 CPUs
This AppImage build is based on EL7 (via CentOS 7)
CentOS 7 was first released on 07 July 2014 and went end-of-life on 30 June 2024.
# Version Info
See the AppImage main binary file naming, release tag information and AppInfo metadata
for the exact magic version inside the archive. When starting AppImage by default the
Tcl console banner can also provide version information, also using the `version` Tcl
command.
# Build Info
* Based on CentOS 7 (EL7)
* Tcl/Tk 8.6.16
* and Magic 8.x
* all default modules enabled, but without OpenGL (includes Display drivers cairo/X11)
# FAQ: How to use
Download the *.AppImage file relevant to your platform and run:
```
chmod +x Magic-x86_64.AppImage
./Magic-x86_64.AppImage
```
Example startup with command line options:
```
./Magic-x86_64.AppImage -d XR -T scmos
```
# FAQ: How to use (inside docker / podman)
```
chmod +x Magic-x86_64.AppImage
### Podman or Docker, use :Z when rootless with selinux enabled
podman run --rm --device /dev/fuse --privileged \
-v "$(pwd):/tmp/work:Z" -v "/tmp/.X11-unix/X0:/tmp/.X11-unix/X0:Z" \
-e DISPLAY -ti centos:7
### Inside Docker:
echo "FIXUP yum from vault and update" \
&& ls -l /etc/yum.repos.d/ \
&& cp /etc/yum.repos.d/CentOS-Base.repo /tmp/CentOS-Base.repo.old \
&& sed -e 's/mirror.centos.org/vault.centos.org/g' -i /etc/yum.repos.d/*.repo \
&& sed -e 's/^#.*baseurl=http/baseurl=http/g' -i /etc/yum.repos.d/*.repo \
&& sed -e 's/^mirrorlist=http/#mirrorlist=http/g' -i /etc/yum.repos.d/*.repo \
&& diff -u /tmp/CentOS-Base.repo.old /etc/yum.repos.d/CentOS-Base.repo; \
yum clean all \
&& yum -y update \
&& rm -f /tmp/CentOS-Base.repo.old
yum install -y fuse libX11 cairo
cd /tmp/work
./Magic-x86_64.AppImage -d XR -T scmos
```
# Building Requirements
* A reasonably recent GNU/Linux host
* GNU make
* Docker 20+
* Git
* curl
The final build is then packaged into an AppImage using AppImageTool on the host machine.
# Build Instructions
`make`
# Installation Instructions
`make install`
# FAQ: Is my CPU supported ?
Supports all x86_64 CPUs. The Linux ABI in use is the original x86-64 ABI (v1).
Use the command `/lib64/ld-linux-x86-64.so.2 --help` to see which CPUs your
Linux distribtion supports (and your CPU) look for the word "supported".
# FAQ: The DSO versioning link dependencies?
The information here provides an outline of what versions to expect from EL7
of the major dependencies, to assist you in a compatibility check with your
Linux distribution of choice.
The actual versions in our public releases can differ slightly inline with
the EL7 support compatibility and ABI versioning policies for the support
lifecycle of the distribution.
The most important items are the Direct Dependencies and the availabilty
of a suitable graphics DSO as per your '-d' choice.
Direct Runtime Dependencies (from /prefix/**):
| DSO Filename | DSO Symbol Version | Related Packages |
| :--------------------- | :------------------ | :------------------- |
| libc.so.6 | GLIBC_2.14 | glibc-2.17-326 |
| libz.so.1 | ZLIB_1.2.2 | zlib-1.2.7-21 |
Optional/Modular Runtime Dependencies (depending on graphics mode):
| DSO Filename | DSO Symbol Version | Related Packages |
| :--------------------- | :------------------ | :------------------- |
| libcairo.so.2 | | |
| libcairo.so.2.11512.0 | | cairo-1.15.12-4 |
| libGL.so.1 | | |
| libglvnd-glx-1:1.0.1-0 | | mesa-libGL-18.3.4-12 |
| libGLU.so.1 | | mesa-libGLU-9.0.0-4 |
Transitive/Third-Party Runtime Dependencies (for information only):
| DSO Filename | DSO Symbol Version | Related Packages |
| :--------------------- | :------------------ | :------------------- |
| libc.so.6 | GLIBC_2.35 | glibc-2.17-326 |
| libstdc++.so.6 | GLIBCXX_3.4 | gcc-4.8.5-44 |
| libstdc++.so.6 | CXXABI_1.3.9 | gcc-4.8.5-44 |
| libgcc_s.so.1 | | |
| libgcc_s-4.8.5-20150702.so.1 | GCC_4.2.0 | libgcc-4.8.5-44 |
| libxml2.so.2 | LIBXML2_2.6.0 | libxml2-2.9.1-6 |
| libpng15.so.15 | | |
| libpng15.so.15.13.0 | PNG16_0 | libpng-1:1.5.13-8 |
| liblzma.so.5 | XZ_5.0 | xz-libs-5.2.2-2 |
| libz.so.1 | ZLIB_1.2.9 | zlib-1.2.7-21 |

View File

@ -1,58 +0,0 @@
FROM almalinux:8
USER root
# Build Dependencies (and dump version to logging)
RUN dnf install -y python311 zlib-devel ncurses-devel readline-devel cairo-devel freeglut-devel \
mesa-libGLU-devel mesa-libGL-devel libX11-devel libstdc++-devel gcc gcc-c++ make git tcsh \
&& echo "### rpm -qa:" \
&& rpm -qa | sort \
&& echo ""
#RUN dnf group install -y "Development Tools"
# Tcl/Tk
WORKDIR /tcl
RUN curl -L https://prdownloads.sourceforge.net/tcl/tcl8.6.16-src.tar.gz | tar --strip-components=1 -xzC . \
&& cd unix \
&& ./configure --prefix=/prefix \
&& make \
&& make install
WORKDIR /tk
RUN curl -L https://prdownloads.sourceforge.net/tcl/tk8.6.16-src.tar.gz | tar --strip-components=1 -xzC . \
&& cd unix \
&& ./configure --prefix=/prefix --with-tcl=/prefix/lib \
&& make \
&& make install
WORKDIR /prefix/bin
RUN cp ./wish8.6 ./wish
RUN cp ./tclsh8.6 ./tclsh
# Magic
WORKDIR /magic
COPY . .
RUN ./configure \
--prefix=/prefix \
--with-tcl=/prefix/lib \
--with-tk=/prefix/lib \
&& make clean \
&& make database/database.h \
&& make -j$(nproc) \
&& make install
# Produce summary of what was created and confirm their DSOs
RUN echo "### filesystem:" \
find /prefix -printf "%y/%M/%m %i/%n %l %u/%U %g/%G %s/%b %T+/%T@\t%p\n"; \
ls -lR /prefix; \
find /prefix -type f -perm /111 -exec bash -c "echo \#\#\# {}; ldd -v {}" \; 2>/dev/null; \
for name in libgcc_s libstdc++ libpng liblzma libxml2 libz libcairo libGL libGLU; do \
find /lib64 /usr/lib64 -maxdepth 2 -name "*.so" -name "${name}*" -exec bash -c "echo \#\#\# {}; ldd -v {}" \; 2>/dev/null; \
done; \
echo "###"
WORKDIR /
RUN tar -czf /prefix.tar.gz -C ./prefix .
CMD ["/bin/bash"]

View File

@ -1,46 +0,0 @@
MAGIC_SRC_ROOT = ../..
RESOURCES := $(shell find ../rsc/ -type f)
ARCH := $(shell uname -m)
APPIMAGE = Magic-$(ARCH).AppImage
VERSION_MAGIC := $(shell cat $(MAGIC_SRC_ROOT)/VERSION)
VERSION_TSTAMP := $(shell git show -s "--format=%cs" | tr -d '-')
VERSION_HASH := $(shell git show -s "--format=%h")
VERSION_NUM ?= $(VERSION_MAGIC)~$(VERSION_TSTAMP)~$(VERSION_HASH)
VERSION := $(VERSION_NUM)
# Allow CI to override
APPIMAGETOOL_DOWNLOAD_URL ?= https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage
all: $(APPIMAGE)
.PHONY: prefix/bin/magic
prefix/bin/magic: Dockerfile Makefile
@echo "APPIMAGE=$(APPIMAGE)"
@echo "VERSION=$(VERSION)"
@echo "ARCH=$(ARCH)"
@echo "RESOURCES=$(RESOURCES)"
rm -rf prefix
docker build -t magic_build -f ./Dockerfile $(MAGIC_SRC_ROOT)
id=$$(docker create magic_build) ; \
docker cp $$id:/prefix ./prefix ; \
docker rm -v $$id
mkdir -p prefix/lib/tcl8.6.16
cp -r prefix/lib/tcl8.6 prefix/lib/tcl8.6.16/library
appimagetool:
curl -L "$(APPIMAGETOOL_DOWNLOAD_URL)" > ./appimagetool
chmod +x ./appimagetool
$(APPIMAGE): prefix/bin/magic appimagetool $(RESOURCES)
cp $(RESOURCES) ./prefix/
./appimagetool prefix
PREFIX ?= /usr/local
install:
install $(APPIMAGE) $(PREFIX)/bin/magic
.PHONY: clean
clean:
rm -f *.AppImage
rm -f prefix.tar.gz
rm -rf prefix

View File

@ -1,126 +0,0 @@
This is an AppImage that runs on all GNU/Linux platforms with:
* FUSE
* This excludes non-privileged Docker containers unfortunately, unless pre-extracted.
* GLIBC 2.28+
* Cairo 1.15+
* Supports all Linux x86_64 CPUs
This AppImage build is based on EL8 (via AlmaLinux 8)
AlmaLinux 8 was first released on 20 March 2021, active support ends 31 May 2024,
security support ends 31 May 2029 (please see AlmaLinux bulletins for
up-to-date information).
# Version Info
See the AppImage main binary file naming, release tag information and AppInfo metadata
for the exact magic version inside the archive. When starting AppImage by default the
Tcl console banner can also provide version information, also using the `version` Tcl
command.
* Based on AlmaLinux 8 (EL8)
* Tcl/Tk 8.6.16
* and Magic 8.x
* all default modules enabled (including all Display drivers cairo/X11/OpenGL)
# FAQ: How to use
Download the *.AppImage file relevant to your platform and run:
```
chmod +x Magic-x86_64.AppImage
./Magic-x86_64.AppImage
```
Example startup with command line options:
```
./Magic-x86_64.AppImage -d XR -T scmos
```
# FAQ: How to use (inside docker / podman)
```
chmod +x Magic-x86_64.AppImage
### Podman or Docker, use :Z when rootless with selinux enabled
podman run --rm --device /dev/fuse --privileged \
-v "$(pwd):/tmp/work:Z" -v "/tmp/.X11-unix/X0:/tmp/.X11-unix/X0:Z" \
-e DISPLAY -ti almalinux:8
### Inside Docker:
dnf update -y
dnf install -y fuse libX11 cairo libGL libGLU
cd /tmp/work
./Magic-x86_64.AppImage -d XR -T scmos
```
# Building Requirements
* A reasonably recent GNU/Linux host
* GNU make
* Docker
* Git
* curl
The final build is then packaged into an AppImage using AppImageTool on the host machine.
# Build Instructions
`make`
# Installation Instructions
`make install`
# FAQ: Is my CPU supported ?
Supports all x86_64 CPUs. The Linux ABI in use is the original x86-64 ABI (v1).
Use the command `/lib64/ld-linux-x86-64.so.2 --help` to see which CPUs your
Linux distribtion supports (and your CPU) look for the word "supported".
# FAQ: The DSO versioning link dependencies?
The information here provides an outline of what versions to expect from EL8
of the major dependencies, to assist you with a compatibility check with your
Linux distribution of choice.
The actual versions in our public releases can differ slightly inline with
the EL8 support compatibility and ABI versioning policies for the support
lifecycle of the distribution.
The most important items are the Direct Dependencies and the availabilty
of a suitable graphics DSO as per your '-d' choice.
Direct Runtime Dependencies (from /prefix/**):
| DSO Filename | DSO Symbol Version | Related Packages |
| :--------------------- | :------------------ | :------------------- |
| libc.so.6 | GLIBC_2.14 | glibc-2.28-251 |
| libz.so.1 | ZLIB_1.2.2 | zlib-1.2.11-25 |
Optional/Modular Runtime Dependencies (depending on graphics mode):
| DSO Filename | DSO Symbol Version | Related Packages |
| :--------------------- | :------------------ | :------------------- |
| libcairo.so.2 | | |
| libcairo.so.2.11512.0 | | cairo-1.15.12-6 |
| libGL.so.1 | | libglvnd-glx-1:1.3.4-2 |
| | | mesa-libGL-23.1.4-4 |
| libGLU.so.1 | | mesa-libGLU-9.0.0-15 |
Transitive/Third-Party Runtime Dependencies (for information only):
| DSO Filename | DSO Symbol Version | Related Packages |
| :--------------------- | :------------------ | :------------------- |
| libc.so.6 | GLIBC_2.35 | glibc-2.28-251 |
| libstdc++.so.6 | GLIBCXX_3.4 | gcc-c++-8.5.0 |
| libstdc++.so.6 | CXXABI_1.3.9 | gcc-c++-8.5.0 |
| libgcc_s.so.1 | GCC_4.2.0 | libgcc-8.5.0-26 |
| libxml2.so.2 | | libxml2-2.9.7-19 |
| libpng16.so.16 | PNG16_0 | libpng-2:1.6.34-5 |
| liblzma.so.5 | | xz-libs-5.2.4-4 |
| libz.so.1 | ZLIB_1.2.9 | zlib-1.2.11-25 |

View File

@ -1,59 +0,0 @@
FROM almalinux:9
USER root
# Build Dependencies (and dump version to logging)
RUN dnf install -y python311 zlib-devel ncurses-devel readline-devel cairo-devel freeglut-devel \
mesa-libGLU-devel mesa-libGL-devel libX11-devel libstdc++-devel gcc gcc-c++ make git tcsh \
zip \
&& echo "### rpm -qa:" \
&& rpm -qa | sort \
&& echo ""
#RUN dnf group install -y "Development Tools"
# Tcl/Tk
WORKDIR /tcl
RUN curl -L https://prdownloads.sourceforge.net/tcl/tcl9.0.1-src.tar.gz | tar --strip-components=1 -xzC . \
&& cd unix \
&& ./configure --prefix=/prefix \
&& make \
&& make install install-libraries install-msgs install-tzdata
WORKDIR /tk
RUN curl -L https://prdownloads.sourceforge.net/tcl/tk9.0.1-src.tar.gz | tar --strip-components=1 -xzC . \
&& cd unix \
&& ./configure --prefix=/prefix --with-tcl=/prefix/lib \
&& make \
&& make install install-libraries
WORKDIR /prefix/bin
RUN cp ./wish9.0 ./wish
RUN cp ./tclsh9.0 ./tclsh
# Magic
WORKDIR /magic
COPY . .
RUN ./configure \
--prefix=/prefix \
--with-tcl=/prefix/lib \
--with-tk=/prefix/lib \
&& make clean \
&& make database/database.h \
&& make -j$(nproc) \
&& make install
# Produce summary of what was created and confirm their DSOs
RUN echo "### filesystem:" \
find /prefix -printf "%y/%M/%m %i/%n %l %u/%U %g/%G %s/%b %T+/%T@\t%p\n"; \
ls -lR /prefix; \
find /prefix -type f -perm /111 -exec bash -c "echo \#\#\# {}; ldd -v {}" \; 2>/dev/null; \
for name in libgcc_s libstdc++ libpng liblzma libxml2 libz libcairo libGL libGLU; do \
find /lib64 /usr/lib64 -maxdepth 2 -name "*.so" -name "${name}*" -exec bash -c "echo \#\#\# {}; ldd -v {}" \; 2>/dev/null; \
done; \
echo "###"
WORKDIR /
RUN tar -czf /prefix.tar.gz -C ./prefix .
CMD ["/bin/bash"]

View File

@ -1,46 +0,0 @@
MAGIC_SRC_ROOT = ../..
RESOURCES := $(shell find ../rsc/ -type f)
ARCH := $(shell uname -m)
APPIMAGE = Magic-$(ARCH).AppImage
VERSION_MAGIC := $(shell cat $(MAGIC_SRC_ROOT)/VERSION)
VERSION_TSTAMP := $(shell git show -s "--format=%cs" | tr -d '-')
VERSION_HASH := $(shell git show -s "--format=%h")
VERSION_NUM ?= $(VERSION_MAGIC)~$(VERSION_TSTAMP)~$(VERSION_HASH)
VERSION := $(VERSION_NUM)
# Allow CI to override
APPIMAGETOOL_DOWNLOAD_URL ?= https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage
all: $(APPIMAGE)
.PHONY: prefix/bin/magic
prefix/bin/magic: Dockerfile Makefile
@echo "APPIMAGE=$(APPIMAGE)"
@echo "VERSION=$(VERSION)"
@echo "ARCH=$(ARCH)"
@echo "RESOURCES=$(RESOURCES)"
rm -rf prefix
docker build -t magic_build -f ./Dockerfile $(MAGIC_SRC_ROOT)
id=$$(docker create magic_build) ; \
docker cp $$id:/prefix ./prefix ; \
docker rm -v $$id
mkdir -p prefix/lib/tcl9.0.1
cp -r prefix/lib/tcl9.0 prefix/lib/tcl9.0.1/library
appimagetool:
curl -L "$(APPIMAGETOOL_DOWNLOAD_URL)" > ./appimagetool
chmod +x ./appimagetool
$(APPIMAGE): prefix/bin/magic appimagetool $(RESOURCES)
cp $(RESOURCES) ./prefix/
./appimagetool prefix
PREFIX ?= /usr/local
install:
install $(APPIMAGE) $(PREFIX)/bin/magic
.PHONY: clean
clean:
rm -f *.AppImage
rm -f prefix.tar.gz
rm -rf prefix

View File

@ -1,128 +0,0 @@
This is an AppImage that runs on all GNU/Linux platforms with:
* FUSE
* This excludes non-privileged Docker containers unfortunately, unless pre-extracted.
* GLIBC 2.34+
* Cairo 1.17+
* May require runtime CPU matching Linux ABI x86-64-v2 and newer (CPUs with SSE4.2/CX16 via `lscpu`).
This AppImage build is based on EL9 (via AlmaLinux 9)
AlmaLinux 9 was first released on 26 May 2022, full support ends 31 May 2027,
maintenance support ends 31 May 2032 (please see AlmaLinux bulletins for
up-to-date information).
# Version Info
See the AppImage main binary file naming, release tag information and AppInfo metadata
for the exact magic version inside the archive. When starting AppImage by default the
Tcl console banner can also provide version information, also using the `version` Tcl
command.
# Build Info
* Based on AlmaLinux 9 (EL9)
* Tcl/Tk 9.0.1
* and Magic 8.x
* all default modules enabled (including all Display drivers cairo/X11/OpenGL)
# FAQ: How to use
Download the *.AppImage file relevant to your platform and run:
```
chmod +x Magic-x86_64.AppImage
./Magic-x86_64.AppImage
```
Example startup with command line options:
```
./Magic-x86_64.AppImage -d XR -T scmos
```
# FAQ: How to use (inside docker / podman)
```
chmod +x Magic-x86_64.AppImage
### Podman or Docker, use :Z when rootless with selinux enabled
podman run --rm --device /dev/fuse --privileged \
-v "$(pwd):/tmp/work:Z" -v "/tmp/.X11-unix/X0:/tmp/.X11-unix/X0:Z" \
-e DISPLAY -ti almalinux:9
### Inside Docker:
dnf update -y
dnf install -y fuse libX11 cairo libGL libGLU
cd /tmp/work
./Magic-x86_64.AppImage -d XR -T scmos
```
# Building Requirements
* A reasonably recent GNU/Linux host
* GNU make
* Docker
* Git
* curl
The final build is then packaged into an AppImage using AppImageTool on the host machine.
# Build Instructions
`make`
# Installation Instructions
`make install`
# FAQ: Is my CPU supported ?
This is built with the standard x86_64 Linux ABI version for AlmaLinux 9.
Use the command `/lib64/ld-linux-x86-64.so.2 --help` to see which CPUs your
Linux distribtion supports (and your CPU) look for the word "supported".
# FAQ: The DSO versioning link dependencies?
The information here provides an outline of what versions to expect from EL9
of the major dependencies, to assist you in a compatibility check with your
Linux distribution of choice.
The actual versions in our public releases can differ slightly inline with
the EL9 support compatibility and ABI versioning policies for the support
lifecycle of the distribution.
The most important items are the Direct Dependencies and the availabilty
of a suitable graphics DSO as per your '-d' choice.
Direct Runtime Dependencies (from /prefix/**):
| DSO Filename | DSO Symbol Version | Related Packages |
| :--------------------- | :------------------ | :------------------- |
| libc.so.6 | GLIBC_2.34 | glibc-2.34-168 |
| libz.so.1 | ZLIB_1.2.2 | zlib-1.2.11-40 |
Optional/Modular Runtime Dependencies (depending on graphics mode):
| DSO Filename | DSO Symbol Version | Related Packages |
| :--------------------- | :------------------ | :------------------- |
| libcairo.so.2 | | |
| libcairo.so.2.11704.0 | | cairo-1.17.4-7 |
| libGL.so.1 | | libglvnd-glx-1:1.3.4 |
| | | mesa-libGL-24.2.8-2 |
| libGLU.so.1 | | mesa-libGLU-9.0.1 |
Transitive/Third-Party Runtime Dependencies (for information only):
| DSO Filename | DSO Symbol Version | Related Packages |
| :--------------------- | :------------------ | :------------------- |
| libc.so.6 | GLIBC_2.35 | glibc-2.34-168 |
| libstdc++.so.6 | CXXABI_1.3.9 | gcc-c++-11.5.0-5 |
| libstdc++.so.6 | GLIBCXX_3.4 | gcc-c++-11.5.0-5 |
| libgcc_s.so.1 | GCC_4.2.0 | libgcc-11.5.0-2 |
| libxml2.so.2 | LIBXML2_2.6.0 | libxml2-2.9.13-9 |
| libpng16.so.16 | PNG16_0 | ibpng-2:1.6.37-12 |
| liblzma.so.5 | XZ_5.0 | xz-libs-5.2.5-8 |
| libz.so.1 | ZLIB_1.2.9 | zlib-1.2.11-40 |

44
appimage/Dockerfile Normal file
View File

@ -0,0 +1,44 @@
FROM centos/python-38-centos7:20210726-fad62e9
USER root
# Build Dependencies
RUN yum install -y cairo-devel freeglut-devel gcc make tcsh
# Tcl/Tk
WORKDIR /tcl
RUN curl -L https://prdownloads.sourceforge.net/tcl/tcl8.6.12-src.tar.gz | tar --strip-components=1 -xzC . \
&& cd unix \
&& ./configure --prefix=/prefix \
&& make \
&& make install
WORKDIR /tk
RUN curl -L https://prdownloads.sourceforge.net/tcl/tk8.6.12-src.tar.gz | tar --strip-components=1 -xzC . \
&& cd unix \
&& ./configure --prefix=/prefix --with-tcl=/prefix/lib\
&& make \
&& make install
WORKDIR /prefix/bin
RUN cp ./wish8.6 ./wish
RUN cp ./tclsh8.6 ./tclsh
# Magic
WORKDIR /magic
COPY . .
RUN ./configure \
--prefix=/prefix \
--with-tcl=/prefix/lib \
--with-tk=/prefix/lib \
--without-opengl \
&& make clean \
&& make database/database.h \
&& make -j$(nproc) \
&& make install
WORKDIR /
RUN tar -czf /prefix.tar.gz -C ./prefix .
CMD ["/bin/bash"]

33
appimage/Makefile Normal file
View File

@ -0,0 +1,33 @@
RESOURCES = $(shell find rsc/ -type f)
ARCH = $(shell uname -m)
APPIMAGE = Magic-$(ARCH).AppImage
all: $(APPIMAGE)
.PHONY: prefix/bin/magic
prefix/bin/magic: Dockerfile Makefile
rm -rf prefix
docker build -t magic_build -f ./Dockerfile ..
id=$$(docker create magic_build) ; \
docker cp $$id:/prefix ./prefix ; \
docker rm -v $$id
mkdir -p prefix/lib/tcl8.6.12
cp -r prefix/lib/tcl8.6 prefix/lib/tcl8.6.12/library
appimagetool:
curl -L https://github.com/AppImage/AppImageKit/releases/download/13/appimagetool-x86_64.AppImage > ./appimagetool
chmod +x ./appimagetool
$(APPIMAGE): prefix/bin/magic appimagetool $(RESOURCES)
cp $(RESOURCES) ./prefix
./appimagetool prefix
PREFIX ?= /usr/local
install:
install $(APPIMAGE) $(PREFIX)/bin/magic
.PHONY: clean
clean:
rm -f *.AppImage
rm -f prefix.tar.gz
rm -rf prefix

24
appimage/README.md Normal file
View File

@ -0,0 +1,24 @@
This is an AppImage that runs on all GNU/Linux platforms with:
* FUSE
* This excludes non-privileged Docker containers unfortunately, unless pre-extracted.
* GLIBC 2.17+
* Cairo 1.8+
That's most Linux distributions released in 2016 or later.
# Build Info
A Dockerfile on CentOS 7 (needed for older glibc) image builds Tcl, Tk and Magic.
The final build is then packaged into an AppImage using AppImageTool on the host machine.
# Building Requirements
* A reasonably recent GNU/Linux host
* Docker 20+
* curl
# Build Instructions
`make`
# Installation Instructions
`make install`

View File

@ -1,39 +1,7 @@
#!/usr/bin/env bash
#!/bin/sh
export CURDIR=$(dirname $(readlink -f "${0}"))
export PATH="${CURDIR}/bin":$PATH
export LD_LIBRARY_PATH=${CURDIR}/lib:$LD_LIBRARY_PATH
export CAD_ROOT="${CURDIR}/lib"
export MAGIC_WISH="${CURDIR}/bin/wish"
function my_echo() {
if [ "$MAGIC_VERBOSE" != "0" ]
then
echo -- $@
fi
}
# Attempt to set by default a valid 'ulimit -n' based on TCL version this
# will automatically apply valid limit inside docker running processes.
if [ "X${MAGIC_ULIMIT_NOFILE:+set}" = "X" ] # not set to something
then
if $MAGIC_WISH "${CURDIR}/version_check.tcl" | grep -q "=8\." # only needed for tcl8
then
if [ $(ulimit -Sn) -gt 1024 ] # only reduce >1024 to 1024
then
MAGIC_ULIMIT_NOFILE=1024
my_echo "# ulimit -Sn reduced from $(ulimit -Sn) to $MAGIC_ULIMIT_NOFILE"
fi
fi
fi
if [ "X$MAGIC_ULIMIT_NOFILE" != "X" ] # non empty
then
# Inform user we did this and hint at how to customize
my_echo "ulimit -Sn $MAGIC_ULIMIT_NOFILE # use \$MAGIC_ULIMIT_NOFILE to customize"
ulimit -Sn $MAGIC_ULIMIT_NOFILE
fi
my_echo "# Starting Magic"
exec "${CURDIR}/bin/magic" "$@"
exec "${CURDIR}/bin/magic" $@

View File

@ -1,4 +0,0 @@
# Usage: wish version_check.tcl
puts "tcl_version=$tcl_version"
puts "tk_version=$tk_version"
exit 0

View File

@ -93,7 +93,7 @@ static BinArray *bpBinArrayNew(int dx, /* x diameter of bins */
/* allocate array */
size = sizeof(BinArray) + numBins*(sizeof(void *));
new = (BinArray *)callocMagic(1, size);
new = (BinArray *)callocMagic(size);
/* initial */
new->ba_bbox = *bbox;
@ -567,9 +567,6 @@ BinArray *bpBinArrayBuild(Rect bbox,
int numBins;
int count;
/* Added by Tim, 2/19/2024 */
/* This line is not supposed to be needed? */
if ((!subbin) && ((pointertype)elements & BT_ARRAY)) return NULL;
if(BPD) DumpRect("#### bpBinArrayBuild, TOP bbox= ", &bbox);

View File

@ -78,7 +78,6 @@ void bpDumpRect(Rect *r)
fprintf(stderr,"%d",
r->r_ytop);
}
#ifdef CIF_MODULE
else
{
float oscale;
@ -94,7 +93,6 @@ void bpDumpRect(Rect *r)
fprintf(stderr,"%f",
oscale * (float)r->r_ytop);
}
#endif
}
/*
@ -172,7 +170,6 @@ static void bpBinArrayDump(BinArray *ba, int indent)
fprintf(stderr,"{dx %d} {dy %d} ",
dx,dy);
}
#ifdef CIF_MODULE
else
{
float oscale;
@ -185,7 +182,6 @@ static void bpBinArrayDump(BinArray *ba, int indent)
fprintf(stderr,"{dy %f} ",
(float)dy * oscale);
}
#endif
fprintf(stderr,"{dimX %d} {dimY %d} { bbox ",
dimX,
dimY);

View File

@ -50,9 +50,9 @@
*/
void BPEnumInit(BPEnum *bpe, /* enum to initialize */
BPlane *bp,
const Rect *area, /* search area */
Rect *area, /* search area */
int match,
const char *id) /* for debugging */
char *id) /* for debugging */
{
bool inside = FALSE;
bpe->bpe_plane = bp;

View File

@ -25,8 +25,8 @@
//
// ************************************************************************
#ifndef _MAGIC__BPLANE__BPENUM_H
#define _MAGIC__BPLANE__BPENUM_H
#ifndef _BPENUM_H
#define _BPENUM_H
/* bpEnum.h --
*
@ -305,7 +305,7 @@ bpEnumNextBin(BPEnum *bpe, bool inside)
{
BPStack *bps = bpe->bpe_top;
#ifdef BPARANOID
#ifdef PARANOID
ASSERT(bps,"bpEnumNextBin");
ASSERT(!bpe->bpe_nextElement,"bpEnumNextBin");
#endif
@ -506,23 +506,23 @@ static __inline__ void *BPEnumNext(BPEnum *bpe)
switch (bpe->bpe_top->bps_state)
{
case BPS_BINS:
if((e=bpEnumNextBINS(bpe, 0))) return e;
if(e=bpEnumNextBINS(bpe, 0)) return e;
break;
case BPS_BINS_INSIDE:
if((e=bpEnumNextBINS(bpe, 1))) return e;
if(e=bpEnumNextBINS(bpe, 1)) return e;
break;
case BPS_INBOX:
if((e=bpEnumNextINBOX(bpe, 0))) return e;
if(e=bpEnumNextINBOX(bpe, 0)) return e;
break;
case BPS_INBOX_INSIDE:
if((e=bpEnumNextINBOX(bpe, 1))) return e;
if(e=bpEnumNextINBOX(bpe, 1)) return e;
break;
case BPS_HASH:
if((e=bpEnumNextHASH(bpe))) return e;
if(e=bpEnumNextHASH(bpe)) return e;
break;
case BPS_DONE:
@ -534,4 +534,4 @@ static __inline__ void *BPEnumNext(BPEnum *bpe)
}
}
#endif /* _MAGIC__BPLANE__BPENUM_H */
#endif /* _BPENUM_H */

View File

@ -128,7 +128,7 @@ void BPAdd(BPlane *bp, void *element)
"BPAdd, attempted during active enumerations");
/* element rect must be canonical! */
#ifdef BPARANOID
#ifdef PARANOID
ASSERT(GeoIsCanonicalRect(r),"BPAdd, rect must be canonical.");
#endif
@ -262,7 +262,7 @@ Rect BPBBox(BPlane *bp)
e = BPEnumNext(&bpe);
bp->bp_bbox = e->e_rect;
while((e = BPEnumNext(&bpe)))
while(e = BPEnumNext(&bpe))
{
GeoIncludeRectInBBox(&e->e_rect, &bp->bp_bbox);
}

View File

@ -27,12 +27,12 @@
#ifndef _MAGIC__BPLANE__BPOPAQUE_H
#define _MAGIC__BPLANE__BPOPAQUE_H
#ifndef _BPOPAQUE_H
#define _BPOPAQUE_H
#ifndef _MAGIC__UTILS__IHASH_H
#ifndef _IHASH_H
#include "utils/ihash.h"
#endif
#endif /* _IHASH_H */
/*
* bpOpaque.h --
@ -106,7 +106,7 @@ static __inline__ bool bpBinType(BinArray *ba, int i)
static __inline__ Element *bpBinList(BinArray *ba, int i)
{
#ifdef BPARANOID
#ifdef PARANOID
ASSERT(bpBinType(ba,i)==BT_LIST,"bpBinList");
#endif
return (Element *) ba->ba_bins[i];
@ -114,7 +114,7 @@ static __inline__ Element *bpBinList(BinArray *ba, int i)
static __inline__ Element **bpBinListHead(BinArray *ba, int i)
{
#ifdef BPARANOID
#ifdef PARANOID
ASSERT(bpBinType(ba,i)==BT_LIST,"bpBinList");
#endif
return (Element **) &ba->ba_bins[i];
@ -122,7 +122,7 @@ static __inline__ Element **bpBinListHead(BinArray *ba, int i)
static __inline__ BinArray *bpSubArray(BinArray *ba, int i)
{
#ifdef BPARANOID
#ifdef PARANOID
ASSERT(bpBinType(ba,i)==BT_ARRAY,"bpSubArray");
#endif
return (BinArray *) ((pointertype) ba->ba_bins[i] & ~BT_TYPE_MASK);
@ -182,7 +182,7 @@ typedef struct bpenum
BPlane *bpe_plane; /* plane being searched */
Rect bpe_srchArea; /* area being searched */
int bpe_match; /* match criteria */
const char *bpe_id; /* for debug */
char *bpe_id; /* for debug */
int bpe_subBinMinX;
int bpe_subBinMinY; /* consider subbinning
* for bins bigger than this.
@ -192,4 +192,4 @@ typedef struct bpenum
BPStack bpe_stack[10000]; /* stack for tree traversal during enum */
} BPEnum;
#endif /* _MAGIC__BPLANE__BPOPAQUE_H */
#endif /* _BPOPAQUE_H */

View File

@ -27,8 +27,8 @@
#ifndef _MAGIC__BPLANE__BPLANE_H
#define _MAGIC__BPLANE__BPLANE_H
#ifndef _BPLANE_H
#define _BPLANE_H
/*
* bplane.h --
@ -185,9 +185,9 @@ extern void BPEnumInit(BPEnum *bpe, /* this procedure initializes this
* enumeration.
*/
BPlane *bp, /* bplane to search */
const Rect *area, /* area to search */
Rect *area, /* area to search */
int match, /* see below */
const char *id); /* for debugging */
char *id); /* for debugging */
/* match values */
/* enum all elements in the bplane (area arg must be null) */
@ -232,4 +232,4 @@ BPStat(BPlane *bp,
int *totUnbinned, /* ret tot num of e's not binned */
int *maxDepth); /* ret max bin array depth */
#endif /* _MAGIC__BPLANE__BPLANE_H */
#endif /* _BPLANE_H */

View File

@ -33,8 +33,8 @@
* This file defines constants and datastructures used internally by the
* bplane module, but not exported to the rest of the world.
*/
#ifndef _MAGIC__BPLANE__BPLANEINT_H
#define _MAGIC__BPLANE__BPLANEINT_H
#ifndef _BPLANEINT_H
#define _BPLANEINT_H
/* Tcl linked Parameters */
extern int bpMinBAPop; /* don't sub(bin) when count less than this
@ -79,4 +79,4 @@ extern Plane *bpTestSnowTile(int size, bool trace);
extern int bpRand(int min, int max);
#endif /* _MAGIC__BPLANE__BPLANEINT_H */
#endif /* _BPLANEINT_H */

View File

@ -18,7 +18,7 @@
*/
#ifndef lint
static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/calma/CalmaRdcl.c,v 1.5 2010/06/25 13:59:24 tim Exp $";
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/calma/CalmaRdcl.c,v 1.5 2010/06/25 13:59:24 tim Exp $";
#endif /* not lint */
#include <stdio.h>
@ -53,16 +53,15 @@ int calmaNonManhattan;
int CalmaFlattenLimit = 10;
int NameConvertErrors = 0;
bool CalmaRewound = FALSE;
bool CalmaRecordPaths = FALSE;
TileTypeBitMask *CalmaMaskHints = NULL;
extern HashTable calmaDefInitHash;
extern int CalmaPolygonCount;
/* forward declarations */
int calmaElementSref(char *filename);
bool calmaParseElement(char *filename, int *pnsrefs, int *pnpaths);
void calmaUniqueCell(char *sname);
int calmaElementSref();
bool calmaParseElement();
void calmaUniqueCell();
/* Structure used when flattening the GDS hierarchy on read-in */
@ -97,8 +96,8 @@ typedef struct {
*/
OFFTYPE
calmaSetPosition(
char *sname)
calmaSetPosition(sname)
char *sname;
{
OFFTYPE originalPos = 0, currentPos = 0;
int nbytes, rtype;
@ -189,7 +188,7 @@ calmaSetPosition(
*/
void
calmaNextCell(void)
calmaNextCell()
{
int nbytes, rtype;
@ -241,14 +240,12 @@ calmaNextCell(void)
*/
Plane **
calmaExact(void)
calmaExact()
{
int pNum;
Plane *newplane;
Plane **parray;
/* Forward reference */
int gdsCopyPaintFunc(Tile *tile, TileType dinfo, GDSCopyRec *gdsCopyRec);
int gdsCopyPaintFunc(); /* Forward reference */
parray = (Plane **)mallocMagic(MAXCIFRLAYERS * sizeof(Plane *));
@ -301,9 +298,9 @@ calmaExact(void)
*/
int
calmaFlattenPolygonFunc(
CellUse *use,
CellDef *parent)
calmaFlattenPolygonFunc(use, parent)
CellUse *use;
CellDef *parent;
{
int i;
CellUse dummy;
@ -350,11 +347,11 @@ calmaFlattenPolygonFunc(
*/
bool
calmaParseStructure(
char *filename) /* Name of the GDS file read */
calmaParseStructure(filename)
char *filename; /* Name of the GDS file read */
{
static const int structs[] = { CALMA_STRCLASS, CALMA_STRTYPE, -1 };
int nbytes = -1, rtype = 0, nsrefs, osrefs, npaths;
static int structs[] = { CALMA_STRCLASS, CALMA_STRTYPE, -1 };
int nbytes, rtype, nsrefs, osrefs, npaths;
char *strname = NULL;
HashEntry *he;
int timestampval = 0;
@ -390,15 +387,6 @@ calmaParseStructure(
he = HashFind(&calmaDefInitHash, strname);
if ((def = (CellDef *)HashGetValue(he)) != NULL)
{
if (def->cd_flags & CDPRELOADED)
{
/* Cell definition was read ahead due to option "flatten" */
/* or "flatglob". Do not complain about seeing it again. */
def->cd_flags &= ~CDPRELOADED;
calmaNextCell();
return TRUE;
}
if (def->cd_flags & CDPROCESSEDGDS)
{
/* If cell definition was marked as processed, then skip */
@ -408,7 +396,6 @@ calmaParseStructure(
if (!CalmaPostOrder && !CalmaRewound)
{
cifReadCellDef = def;
CalmaReadError("Cell \"%s\" was already defined in this file.\n",
strname);
CalmaReadError("Ignoring duplicate definition\n");
@ -420,7 +407,6 @@ calmaParseStructure(
{
char *newname;
cifReadCellDef = def;
CalmaReadError("Cell \"%s\" was already defined in this file.\n",
strname);
newname = (char *)mallocMagic(strlen(strname) + 20);
@ -506,33 +492,28 @@ calmaParseStructure(
if (CalmaReadOnly || predefined)
{
PropertyRecord *proprec;
char cstring[1024];
/* Writing the file position into a string is slow, but */
/* it prevents requiring special handling when printing */
/* out the properties. */
char *fpcopy = (char *)mallocMagic(20);
char *fncopy;
/* Substitute variable for PDK path or ~ for home directory */
/* the same way that cell references are handled in .mag files. */
DBPathSubstitute(filename, cstring, cifReadCellDef);
fncopy = StrDup(NULL, cstring);
sprintf(fpcopy, "%"DLONG_PREFIX"d", (dlong) filepos);
DBPropPut(cifReadCellDef, "GDS_START", (ClientData)fpcopy);
proprec = (PropertyRecord *)mallocMagic(sizeof(PropertyRecord));
proprec->prop_type = PROPERTY_TYPE_DOUBLE;
proprec->prop_len = 1;
proprec->prop_value.prop_double[0] = filepos;
DBPropPut(cifReadCellDef, "GDS_START", (ClientData)proprec);
fpcopy = (char *)mallocMagic(20);
filepos = FTELL(calmaInputFile);
sprintf(fpcopy, "%"DLONG_PREFIX"d", (dlong) filepos);
DBPropPut(cifReadCellDef, "GDS_END", (ClientData)fpcopy);
proprec = (PropertyRecord *)mallocMagic(sizeof(PropertyRecord));
proprec->prop_type = PROPERTY_TYPE_DOUBLE;
proprec->prop_len = 1;
proprec->prop_value.prop_double[0] = filepos;
DBPropPut(cifReadCellDef, "GDS_END", (ClientData)proprec);
proprec = (PropertyRecord *)mallocMagic(sizeof(PropertyRecord) - 7 +
strlen(cstring));
proprec->prop_type = PROPERTY_TYPE_STRING;
proprec->prop_len = 1;
strcpy(proprec->prop_value.prop_string, cstring);
DBPropPut(cifReadCellDef, "GDS_FILE", (ClientData)proprec);
DBPropPut(cifReadCellDef, "GDS_FILE", (ClientData)fncopy);
if (predefined)
{
@ -629,12 +610,8 @@ calmaParseStructure(
(locPolygonCount < CalmaPolygonCount))
DBCellEnum(cifReadCellDef, calmaFlattenPolygonFunc, (ClientData)cifReadCellDef);
/* Because the "label" statement can only match one GDS layer to one magic
* layer, then all labels are subject to adjustment to attach them to
* something meaningful in the layout. The "no-reconnect-labels" option
* is not useful and has been deprecated.
*/
DBAdjustLabelsNew(cifReadCellDef, &TiPlaneRect);
DBAdjustLabelsNew(cifReadCellDef, &TiPlaneRect,
(cifCurReadStyle->crs_flags & CRF_NO_RECONNECT_LABELS) ? 1 : 0);
DBReComputeBbox(cifReadCellDef);
/* Don't bother to register with DRC if we're going to delete the */
@ -694,12 +671,11 @@ syntaxerror:
*/
bool
calmaParseElement(
char *filename,
int *pnsrefs,
int *pnpaths)
calmaParseElement(filename, pnsrefs, pnpaths)
char *filename;
int *pnsrefs, *pnpaths;
{
static const int node[] = { CALMA_ELFLAGS, CALMA_PLEX, CALMA_LAYER,
static int node[] = { CALMA_ELFLAGS, CALMA_PLEX, CALMA_LAYER,
CALMA_NODETYPE, CALMA_XY, -1 };
int nbytes, rtype, madeinst;
@ -757,10 +733,9 @@ calmaParseElement(
*/
int
calmaEnumFunc(
Tile *tile,
TileType dinfo,
int *plane)
calmaEnumFunc(tile, plane)
Tile *tile;
int *plane;
{
return 1;
}
@ -785,26 +760,24 @@ calmaEnumFunc(
*/
int
calmaElementSref(
char *filename)
calmaElementSref(filename)
char *filename;
{
int nbytes, rtype, cols, rows, nref, n, i, savescale;
int xlo, ylo, xhi, yhi, xsep, ysep, angle;
bool madeinst = FALSE, rotated = FALSE;
int xlo, ylo, xhi, yhi, xsep, ysep;
bool madeinst = FALSE;
char *sname = NULL;
bool isArray = FALSE;
bool dolookahead = FALSE;
Transform trans, tinv;
Point refarray[3], refunscaled[3], p;
CellUse *use;
CellDef *def;
int gdsCopyPaintFunc(); /* Forward reference */
int gdsHasUses(); /* Forward reference */
/* Added by NP */
char *useid = NULL, *arraystr = NULL;
int propAttrType;
/* Forward reference */
int gdsCopyPaintFunc(Tile *tile, TileType dinfo, GDSCopyRec *gdsCopyRec);
int gdsHasUses(CellUse *use, ClientData clientdata);
/* Skip CALMA_ELFLAGS, CALMA_PLEX */
calmaSkipSet(calmaElementIgnore);
@ -820,38 +793,7 @@ calmaElementSref(
*/
def = calmaLookCell(sname);
/*
* If the "flatten" option is set, then we always have to seek
* ahead and read the structure in order to determine if it
* meets the requirement of being flattened or not. If the
* "flatglob" option is set, then we need to read ahead and
* read the cell definition so that it can be flatten. This
* requires pattern-matching the cell def.
*/
dolookahead = (CalmaPostOrder || CalmaFlattenUses) ? TRUE : FALSE;
if ((!dolookahead) && (CalmaFlattenUsesByName != NULL))
{
char *pattern;
i = 0;
while (TRUE)
{
pattern = CalmaFlattenUsesByName[i];
if (pattern == NULL) break;
i++;
/* Check pattern against strname */
if (Match(pattern, sname))
{
dolookahead = TRUE;
break;
}
}
}
if (!def && dolookahead)
if (!def && (CalmaPostOrder || CalmaFlattenUses || (CalmaFlattenUsesByName != NULL)))
{
/* Force the GDS parser to read the cell definition in
* post-order. If cellname "sname" is not defined before
@ -885,7 +827,6 @@ calmaElementSref(
FSEEK(calmaInputFile, originalFilePos, SEEK_SET);
cifReadCellDef = calmaLookCell(currentSname);
def = calmaLookCell(sname);
def->cd_flags |= CDPRELOADED;
cifCurReadPlanes = savePlanes;
calmaLayerHash = OrigCalmaLayerHash;
if (crsMultiplier != cifCurReadStyle->crs_multiplier)
@ -990,73 +931,17 @@ calmaElementSref(
refarray[2].p_x = refarray[2].p_y = 0;
}
/* If the array is given an angle, then the meaning of rows and
* columns needs to be swapped for the purpose of ignoring
* X or Y values in the case of a 1-row or 1-column entry.
*/
angle = GeoTransAngle(&trans, 0);
if ((angle == 90) || (angle == 270) || (angle == -90) || (angle == -270))
rotated = TRUE;
/* If this is a cell reference, then we scale to magic coordinates
* and place the cell in the magic database. However, if this is
* a cell to be flattened a la "gds flatten", then we keep the GDS
* coordinates, and don't scale to the magic database.
*
* NOTE: Scaling everything in the middle or reading array data
* and then retroactively adjusting the array data read earlier
* is problematic, and probably incorrect.
*/
for (n = 0; n < nref; n++)
{
savescale = calmaReadScale1;
/* If there is only one column, then X data in the 2nd or 3rd
* entry is irrelevant. If there is only one row, then Y data
* in the 2nd or 3rd entry is irrelevant. Prevent issues caused
* by incorrect/uninitialized data in these positions by ignoring
* them as needed.
*/
if ((n > 0) && ((!rotated && (rows == 1)) || (rotated && (cols == 1))))
{
calmaReadX(&refarray[n], 1);
calmaSkipBytes(4);
refarray[n].p_y = refarray[0].p_y;
}
else if ((n > 0) && ((!rotated && (cols == 1)) || (rotated && (rows == 1))))
{
calmaSkipBytes(4);
calmaReadY(&refarray[n], 1);
refarray[n].p_x = refarray[0].p_x;
}
else
calmaReadPoint(&refarray[n], 1);
if (savescale != calmaReadScale1)
{
/* Scale changed, so update previous points read */
int newscale = calmaReadScale1 / savescale;
for (i = 0; i < n; i++)
{
refarray[i].p_x *= newscale;
refarray[i].p_y *= newscale;
}
}
if (FEOF(calmaInputFile))
return -1;
}
for (n = 0; n < nref; n++)
refunscaled[n] = refarray[n]; // Save for CDFLATGDS cells
for (n = 0; n < nref; n++)
{
savescale = cifCurReadStyle->crs_scaleFactor;
calmaReadPoint(&refarray[n], 1);
refunscaled[n] = refarray[n]; // Save for CDFLATGDS cells
refarray[n].p_x = CIFScaleCoord(refarray[n].p_x, COORD_EXACT);
if (savescale != cifCurReadStyle->crs_scaleFactor)
{
@ -1077,6 +962,9 @@ calmaElementSref(
}
refarray[n].p_x *= (savescale / cifCurReadStyle->crs_scaleFactor);
}
if (FEOF(calmaInputFile))
return -1;
}
/* Skip remainder */
@ -1340,9 +1228,9 @@ calmaElementSref(
/* Callback function for determining if a cell has at least one subcell */
int
gdsHasUses(
CellUse *use,
ClientData clientdata)
gdsHasUses(use, clientdata)
CellUse *use;
ClientData clientdata;
{
return 1;
}
@ -1350,30 +1238,29 @@ gdsHasUses(
/* Callback function for copying paint from one CIF cell into another */
int
gdsCopyPaintFunc(
Tile *tile,
TileType dinfo,
GDSCopyRec *gdsCopyRec)
gdsCopyPaintFunc(tile, gdsCopyRec)
Tile *tile;
GDSCopyRec *gdsCopyRec;
{
int pNum;
TileType newdinfo;
TileType dinfo;
Rect sourceRect, targetRect;
Transform *trans = gdsCopyRec->trans;
Plane *plane = gdsCopyRec->plane;
newdinfo = TiGetTypeExact(tile) | dinfo;
dinfo = TiGetTypeExact(tile);
if (trans)
{
TiToRect(tile, &sourceRect);
GeoTransRect(trans, &sourceRect, &targetRect);
if (IsSplit(tile))
newdinfo = DBTransformDiagonal(TiGetTypeExact(tile) | dinfo, trans);
dinfo = DBTransformDiagonal(TiGetTypeExact(tile), trans);
}
else
TiToRect(tile, &targetRect);
DBNMPaintPlane(plane, newdinfo, &targetRect, CIFPaintTable,
DBNMPaintPlane(plane, dinfo, &targetRect, CIFPaintTable,
(PaintUndoInfo *)NULL);
return 0;
@ -1398,8 +1285,8 @@ gdsCopyPaintFunc(
*/
void
calmaUniqueCell(
char *sname)
calmaUniqueCell(sname)
char *sname;
{
HashEntry *h;
CellDef *def, *testdef;
@ -1458,14 +1345,14 @@ calmaUniqueCell(
*/
CellDef *
calmaFindCell(
const char *name, /* Name of desired cell */
bool *was_called, /* If this cell is in the hash table, then it
calmaFindCell(name, was_called, predefined)
char *name; /* Name of desired cell */
bool *was_called; /* If this cell is in the hash table, then it
* was instanced before it was defined. We
* need to know this so as to avoid flattening
* the cell if requested.
*/
bool *predefined) /* If this cell was in memory before the GDS
bool *predefined; /* If this cell was in memory before the GDS
* file was read, then this flag gets set.
*/
@ -1487,26 +1374,20 @@ calmaFindCell(
* if the cell is used in a parent before being defined
* then it will cause a core dump.
*/
DBReComputeBbox(def);
if (was_called) *was_called = FALSE;
DBReComputeBbox(def);
}
else
{
TxPrintf("Warning: cell %s already existed before reading GDS!\n",
name);
if (CalmaNoDuplicates)
{
TxPrintf("Note: cell %s already existed before reading GDS.\n",
name);
if (predefined) *predefined = TRUE;
TxPrintf("Using pre-existing cell definition\n");
}
else
{
TxPrintf("Warning: cell %s already existed before reading GDS!\n",
name);
}
if (was_called) *was_called = TRUE;
}
HashSetValue(h, def);
if (was_called) *was_called = FALSE;
}
else
{
@ -1545,8 +1426,8 @@ calmaFindCell(
*/
CellDef *
calmaLookCell(
char *name) /* Name of desired cell */
calmaLookCell(name)
char *name; /* Name of desired cell */
{
HashEntry *h;

View File

@ -18,7 +18,7 @@
*/
#ifndef lint
static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/calma/CalmaRdio.c,v 1.1.1.1 2008/02/03 20:43:50 tim Exp $";
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/calma/CalmaRdio.c,v 1.1.1.1 2008/02/03 20:43:50 tim Exp $";
#endif /* not lint */
#include <stdio.h>
@ -50,8 +50,8 @@ static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magi
#include "calma/calma.h"
/* Forward declarations */
bool calmaReadR8(double *pd);
bool calmaSkipBytes(int nbytes);
bool calmaReadR8();
bool calmaSkipBytes();
/*
@ -73,9 +73,9 @@ bool calmaSkipBytes(int nbytes);
*/
bool
calmaReadTransform(
Transform *ptrans, /* Fill in this transform */
char *name) /* Name of subcell (for errors) */
calmaReadTransform(ptrans, name)
Transform *ptrans; /* Fill in this transform */
char *name; /* Name of subcell (for errors) */
{
int nbytes, rtype, flags, angle;
double dangle;
@ -205,9 +205,9 @@ calmaReadTransform(
*/
bool
calmaReadI2Record(
int type, /* Type of record expected */
int *pvalue) /* Store value here */
calmaReadI2Record(type, pvalue)
int type; /* Type of record expected */
int *pvalue; /* Store value here */
{
int nbytes, rtype, n;
@ -250,9 +250,9 @@ eof:
*/
bool
calmaReadI4Record(
int type, /* Type of record expected */
int *pvalue) /* Store value here */
calmaReadI4Record(type, pvalue)
int type; /* Type of record expected */
int *pvalue; /* Store value here */
{
int nbytes, rtype, n;
@ -298,9 +298,9 @@ eof:
*/
bool
calmaReadStampRecord(
int type,
int *stampptr)
calmaReadStampRecord(type, stampptr)
int type;
int *stampptr;
{
int nbytes, rtype;
struct tm gds_timestamp;
@ -371,9 +371,9 @@ eof:
*/
bool
calmaReadStringRecord(
int type,
char **str)
calmaReadStringRecord(type, str)
int type;
char **str;
{
int nbytes, rtype;
@ -389,7 +389,7 @@ calmaReadStringRecord(
nbytes -= CALMAHEADERLENGTH;
*str = (char *) mallocMagic(nbytes + 1);
if (magicFREAD(*str, sizeof (char), nbytes, calmaInputFile) != nbytes)
if (FREAD(*str, sizeof (char), nbytes, calmaInputFile) != nbytes)
goto eof;
*(*str + nbytes) = '\0';
@ -420,21 +420,21 @@ eof:
*/
bool
calmaReadR8(
double *pd) /* Store result in *pd */
calmaReadR8(pd)
double *pd; /* Store result in *pd */
{
int i, exponent;
unsigned char dchars[8];
double mantissa, d;
bool isneg;
if (magicFREAD((char *) dchars, sizeof (char), sizeof dchars,
if (FREAD((char *) dchars, sizeof (char), sizeof dchars,
calmaInputFile) != sizeof dchars)
return (FALSE);
/* Extract the sign and exponent */
exponent = dchars[0];
if ((isneg = (exponent & 0x80)))
if (isneg = (exponent & 0x80))
exponent &= ~0x80;
exponent -= 64;
@ -489,10 +489,10 @@ calmaReadR8(
*/
void
calmaSkipSet(
const int *skipwhat)
calmaSkipSet(skipwhat)
int *skipwhat;
{
const int *skipp;
int *skipp;
int nbytes, rtype;
for (;;)
@ -533,8 +533,8 @@ skipit:
*/
bool
calmaSkipExact(
int type)
calmaSkipExact(type)
int type;
{
int nbytes, rtype;
@ -579,8 +579,8 @@ eof:
*/
bool
calmaSkipTo(
int what)
calmaSkipTo(what)
int what;
{
int nbytes, rtype;
@ -615,8 +615,8 @@ calmaSkipTo(
*/
bool
calmaSkipBytes(
int nbytes) /* Skip this many bytes */
calmaSkipBytes(nbytes)
int nbytes; /* Skip this many bytes */
{
while (nbytes-- > 0)
if (FGETC(calmaInputFile) < 0)

View File

@ -18,7 +18,7 @@
*/
#ifndef lint
static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/calma/CalmaRdpt.c,v 1.7 2010/08/25 17:33:54 tim Exp $";
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/calma/CalmaRdpt.c,v 1.7 2010/08/25 17:33:54 tim Exp $";
#endif /* not lint */
#include <stdio.h>
@ -57,8 +57,8 @@ extern int CalmaPolygonCount;
extern int CalmaPathCount;
extern HashTable calmaDefInitHash;
extern void calmaLayerError(char *mesg, int layer, int dt);
CIFPath *calmaReadPath(int iscale);
extern void calmaLayerError();
bool calmaReadPath();
/*
* ----------------------------------------------------------------------------
@ -82,9 +82,8 @@ CIFPath *calmaReadPath(int iscale);
*/
void
calmaInputRescale(
int n,
int d)
calmaInputRescale(n, d)
int n, d;
{
HashEntry *h;
HashSearch hs;
@ -114,8 +113,6 @@ calmaInputRescale(
/*
* ----------------------------------------------------------------------------
*
* calmaReadX ---
* calmaReadY ---
* calmaReadPoint ---
*
* Read a point from the input.
@ -134,19 +131,13 @@ calmaInputRescale(
* encountered, then everything in the GDS planes is rescaled
* to match.
*
* Notes:
* This routine has been split into individual X and Y reads so that
* array data can be read while ignoring offset information when there
* is only one row or column; otherwise, bad or uninitialized data
* in the record can cause unnecessary and incorrect scaling.
*
* ----------------------------------------------------------------------------
*/
void
calmaReadX(
Point *p,
int iscale)
calmaReadPoint(p, iscale)
Point *p;
int iscale;
{
int rescale;
@ -171,15 +162,6 @@ calmaReadX(
}
}
p->p_x /= calmaReadScale2;
}
void
calmaReadY(
Point *p,
int iscale)
{
int rescale;
READI4((p)->p_y);
p->p_y *= (calmaReadScale1 * iscale);
@ -205,15 +187,6 @@ calmaReadY(
p->p_y /= calmaReadScale2;
}
void
calmaReadPoint(
Point *p,
int iscale)
{
calmaReadX(p, iscale);
calmaReadY(p, iscale);
}
/*
* ----------------------------------------------------------------------------
@ -232,14 +205,14 @@ calmaReadPoint(
*/
void
calmaElementBoundary(void)
calmaElementBoundary()
{
int dt, layer, ciftype;
CIFPath *pathheadp;
LinkedRect *rp;
Plane *plane;
CellUse *use;
CellDef *savedef = NULL, *newdef = NULL;
CellDef *savedef, *newdef = NULL;
/* Skip CALMA_ELFLAGS, CALMA_PLEX */
calmaSkipSet(calmaElementIgnore);
@ -263,8 +236,7 @@ calmaElementBoundary(void)
plane = cifCurReadPlanes[ciftype];
/* Read the path itself, building up a path structure */
pathheadp = calmaReadPath((plane == NULL) ? 0 : 1);
if (pathheadp == NULL)
if (!calmaReadPath(&pathheadp, (plane == NULL) ? 0 : 1))
{
if (plane != NULL)
CalmaReadError("Error while reading path for boundary/box; ignored.\n");
@ -284,18 +256,18 @@ calmaElementBoundary(void)
if ((CalmaSubcellPolygons != CALMA_POLYGON_NONE) && (calmaNonManhattan > 0))
{
/* Place the polygon in its own subcell */
char newname[20];
char newname[] = "polygonXXXXX";
HashEntry *he;
savedef = cifReadCellDef;
/* Make up name for cell */
snprintf(newname, sizeof(newname), "polygon%05d", ++CalmaPolygonCount);
sprintf(newname + 7, "%05d", ++CalmaPolygonCount);
he = HashFind(&calmaDefInitHash, newname);
if (!HashGetValue(he))
{
newdef = calmaFindCell(newname, NULL, NULL);
newdef = calmaFindCell(newname, NULL);
cifReadCellDef = newdef;
DBCellClearDef(cifReadCellDef);
DBCellSetAvail(cifReadCellDef);
@ -386,14 +358,12 @@ calmaElementBoundary(void)
}
/* Paint the rectangles (if any) */
free_magic1_t mm1 = freeMagic1_init();
for (; rp != NULL ; rp = rp->r_next)
{
if (plane)
DBPaintPlane(plane, &rp->r_r, CIFPaintTable, (PaintUndoInfo *)NULL);
freeMagic1(&mm1, (char *) rp);
freeMagic((char *) rp);
}
freeMagic1_end(&mm1);
if (cifCurReadPlanes == cifEditCellPlanes)
{
@ -436,7 +406,7 @@ calmaElementBoundary(void)
*/
void
calmaElementBox(void)
calmaElementBox()
{
int nbytes, rtype, npoints, savescale;
int dt, layer, ciftype;
@ -531,9 +501,9 @@ calmaElementBox(void)
*/
void
calmaElementPath(void)
calmaElementPath()
{
int nbytes = -1, rtype = 0, extend1, extend2;
int nbytes, rtype, extend1, extend2;
int layer, dt, width, pathtype, ciftype, savescale;
int xmin, ymin, xmax, ymax, temp;
CIFPath *pathheadp, *pathp, *previousp;
@ -541,7 +511,7 @@ calmaElementPath(void)
Plane *plane;
int first,last;
CellUse *use;
CellDef *savedef = NULL, *newdef = NULL;
CellDef *savedef, *newdef = NULL;
/* Skip CALMA_ELFLAGS, CALMA_PLEX */
calmaSkipSet(calmaElementIgnore);
@ -624,8 +594,7 @@ calmaElementPath(void)
/* Read the points in the path */
savescale = calmaReadScale1;
pathheadp = calmaReadPath(2);
if (pathheadp == NULL)
if (!calmaReadPath(&pathheadp, 2))
{
CalmaReadError("Improper path; ignored.\n");
return;
@ -693,18 +662,18 @@ calmaElementPath(void)
if (CalmaSubcellPaths)
{
/* Place the path in its own subcell */
char newname[16];
char newname[] = "pathXXXXX";
HashEntry *he;
savedef = cifReadCellDef;
/* Make up name for cell */
snprintf(newname, sizeof(newname), "path%05d", ++CalmaPathCount);
sprintf(newname + 4, "%05d", ++CalmaPathCount);
he = HashFind(&calmaDefInitHash, newname);
if (!HashGetValue(he))
{
newdef = calmaFindCell(newname, NULL, NULL);
newdef = calmaFindCell(newname, NULL);
cifReadCellDef = newdef;
DBCellClearDef(cifReadCellDef);
DBCellSetAvail(cifReadCellDef);
@ -718,12 +687,7 @@ calmaElementPath(void)
}
}
/* If requested by command option, record the path centerline as a
* property of the cell def.
*/
if (CalmaRecordPaths)
CIFPropRecordPath(cifReadCellDef, pathheadp, TRUE, "path");
CIFPropRecordPath(cifReadCellDef, pathheadp, TRUE, "path");
CIFPaintWirePath(pathheadp, width,
(pathtype == CALMAPATH_SQUAREFLUSH || pathtype == CALMAPATH_CUSTOM) ?
FALSE : TRUE, plane, CIFPaintTable, (PaintUndoInfo *)NULL);
@ -765,11 +729,11 @@ calmaElementPath(void)
*/
void
calmaElementText(void)
calmaElementText()
{
static const int ignore[] = { CALMA_PATHTYPE, CALMA_WIDTH, -1 };
static int ignore[] = { CALMA_PATHTYPE, CALMA_WIDTH, -1 };
char *textbody = NULL;
int nbytes = -1, rtype = 0;
int nbytes, rtype;
int layer, textt, cifnum, textpres;
TileType type;
Rect r;
@ -908,11 +872,8 @@ calmaElementText(void)
else
/* Assume that MAG is the label size in microns */
/* "size" is the label size in 10 * (database units) */
/* The "calma magscale" option can be used to */
/* reinterpret the size for any specific GDS file. */
size = (int)(0.5 + ((dval * 1000 * CalmaMagScale
* cifCurReadStyle->crs_multiplier)
/ cifCurReadStyle->crs_scaleFactor));
size = (int)((dval * 1000 * cifCurReadStyle->crs_multiplier)
/ cifCurReadStyle->crs_scaleFactor);
}
else
UNREADRH(nbytes, rtype);
@ -1038,6 +999,8 @@ calmaElementText(void)
flags = 0;
else if (cifnum >= 0 && (cifCurReadStyle->crs_labelSticky[cifnum] != LABEL_TYPE_NONE))
flags = LABEL_STICKY;
else if (cifCurReadStyle->crs_flags & CRF_NO_RECONNECT_LABELS)
flags = LABEL_STICKY;
else
flags = 0;
@ -1133,24 +1096,26 @@ calmaElementText(void)
* centerline, to avoid roundoff errors.
*
* Results:
* non-NULL CIFPath* the caller takes ownership of
* if the path was parsed successfully, otherwise NULL.
* TRUE is returned if the path was parsed successfully,
* FALSE otherwise.
*
* Side effects:
* None
* Modifies the parameter pathheadpp to point to the path
* that is constructed.
*
* ----------------------------------------------------------------------------
*/
CIFPath *
calmaReadPath(
int iscale)
bool
calmaReadPath(pathheadpp, iscale)
CIFPath **pathheadpp;
int iscale;
{
CIFPath path, *pathheadp, *pathtailp, *newpathp;
CIFPath path, *pathtailp, *newpathp;
int nbytes, rtype, npoints, savescale;
bool nonManhattan = FALSE;
pathheadp = (CIFPath *) NULL;
*pathheadpp = (CIFPath *) NULL;
pathtailp = (CIFPath *) NULL;
path.cifp_next = (CIFPath *) NULL;
@ -1159,12 +1124,12 @@ calmaReadPath(
if (nbytes < 0)
{
CalmaReadError("EOF when reading path.\n");
return (NULL);
return (FALSE);
}
if (rtype != CALMA_XY)
{
calmaUnexpected(CALMA_XY, rtype);
return (NULL);
return (FALSE);
}
/* Read this many points (pairs of four-byte integers) */
@ -1175,7 +1140,7 @@ calmaReadPath(
calmaReadPoint(&path.cifp_point, iscale);
if (savescale != calmaReadScale1)
{
CIFPath *phead = pathheadp;
CIFPath *phead = *pathheadpp;
int newscale = calmaReadScale1 / savescale;
while (phead != NULL)
{
@ -1190,8 +1155,8 @@ calmaReadPath(
}
if (FEOF(calmaInputFile))
{
CIFFreePath(pathheadp);
return (NULL);
CIFFreePath(*pathheadpp);
return (FALSE);
}
if (iscale != 0)
@ -1199,7 +1164,7 @@ calmaReadPath(
newpathp = (CIFPath *) mallocMagic((unsigned) (sizeof (CIFPath)));
*newpathp = path;
if (pathheadp)
if (*pathheadpp)
{
/*
* Check that this segment is Manhattan. If not, remember the
@ -1220,11 +1185,11 @@ calmaReadPath(
}
pathtailp->cifp_next = newpathp;
}
else pathheadp = newpathp;
else *pathheadpp = newpathp;
pathtailp = newpathp;
}
}
return (pathheadp);
return (*pathheadpp != NULL);
}
/*
@ -1249,10 +1214,10 @@ calmaReadPath(
*/
void
calmaLayerError(
char *mesg,
int layer,
int dt)
calmaLayerError(mesg, layer, dt)
char *mesg;
int layer;
int dt;
{
CalmaLayerType clt;
HashEntry *he;

View File

@ -17,10 +17,9 @@
*/
#ifndef lint
static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/calma/CalmaRead.c,v 1.3 2010/06/24 12:37:15 tim Exp $";
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/calma/CalmaRead.c,v 1.3 2010/06/24 12:37:15 tim Exp $";
#endif /* not lint */
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
@ -28,12 +27,6 @@ static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magi
#include <netinet/in.h>
/*
* C99 compat
* Mind: tcltk/tclmagic.h must be included prior to all the other headers
*/
#include "tcltk/tclmagic.h"
#include "utils/magic.h"
#include "utils/geometry.h"
#include "tiles/tile.h"
@ -82,12 +75,6 @@ bool CalmaReadOnly = FALSE; /* Set files to read-only and
* retain file position information
* so cells can be written verbatim.
*/
float CalmaMagScale = 1.0; /* Scale by which to interpret the MAG
* record in GDS text records. The
* default is to treat the value as
* the text height in microns. This
* value reinterprets the scale.
*/
bool CalmaNoDRCCheck = FALSE; /* If TRUE, don't mark cells as needing
* a DRC check; they will be assumed
* DRC clean.
@ -111,8 +98,10 @@ bool CalmaUnique = FALSE; /* If TRUE, then if a cell exists in
*/
extern bool CalmaDoLibrary; /* Also used by GDS write */
extern void calmaUnexpected(int wanted, int got);
extern int calmaWriteInitFunc(CellDef *def, ClientData cdata); /* UNUSED */
extern void calmaUnexpected();
extern int calmaWriteInitFunc();
bool calmaParseUnits();
/*
* Scaling.
@ -147,7 +136,7 @@ HashTable calmaLayerHash;
HashTable calmaDefInitHash;
/* Common stuff to ignore */
const int calmaElementIgnore[] = { CALMA_ELFLAGS, CALMA_PLEX, -1 };
int calmaElementIgnore[] = { CALMA_ELFLAGS, CALMA_PLEX, -1 };
/*
* ----------------------------------------------------------------------------
@ -167,18 +156,18 @@ const int calmaElementIgnore[] = { CALMA_ELFLAGS, CALMA_PLEX, -1 };
*/
void
CalmaReadFile(
FILETYPE file, /* File from which to read Calma */
char *filename) /* The real name of the file read */
CalmaReadFile(file, filename)
FILETYPE file; /* File from which to read Calma */
char *filename; /* The real name of the file read */
{
int k, version;
char *libname = NULL, *libnameptr = NULL;
char *libname = NULL, *libnameptr;
MagWindow *mw;
static const int hdrSkip[] = { CALMA_FORMAT, CALMA_MASK, CALMA_ENDMASKS,
CALMA_REFLIBS, CALMA_FONTS, CALMA_ATTRTABLE,
CALMA_STYPTABLE, CALMA_GENERATIONS, -1 };
static const int skipBeforeLib[] = { CALMA_LIBDIRSIZE, CALMA_SRFNAME,
CALMA_LIBSECUR, -1 };
static int hdrSkip[] = { CALMA_FORMAT, CALMA_MASK, CALMA_ENDMASKS,
CALMA_REFLIBS, CALMA_FONTS, CALMA_ATTRTABLE,
CALMA_STYPTABLE, CALMA_GENERATIONS, -1 };
static int skipBeforeLib[] = { CALMA_LIBDIRSIZE, CALMA_SRFNAME,
CALMA_LIBSECUR, -1 };
if (EditCellUse == (CellUse *)NULL)
{
@ -299,7 +288,7 @@ done:
windCheckOnlyWindow(&mw, DBWclientID);
if (mw != NULL)
{
if (calmaLookCell(libnameptr) != (CellDef *)NULL)
if (calmaLookCell(libnameptr, NULL) != (CellDef *)NULL)
DBWloadWindow(mw, libnameptr, 0);
}
freeMagic(libname);
@ -309,11 +298,7 @@ done:
HashKill(&calmaDefInitHash);
UndoEnable();
if (calmaErrorFile != NULL)
{
fclose(calmaErrorFile);
calmaErrorFile = NULL;
}
if (calmaErrorFile != NULL) fclose(calmaErrorFile);
}
/*
@ -347,13 +332,12 @@ done:
*/
bool
calmaParseUnits(void)
calmaParseUnits()
{
int nbytes, rtype = 0;
int nbytes, rtype;
double metersPerDBUnit;
double userUnitsPerDBUnit;
double cuPerDBUnit;
bool compatible;
READRH(nbytes, rtype);
#ifdef lint
@ -372,39 +356,6 @@ calmaParseUnits(void)
/* Read meters per database unit */
if (!calmaReadR8(&metersPerDBUnit)) return (FALSE);
/* Important! When CalmaReadOnly is TRUE, then this file will have its
* contents output verbatim. But if the database units don't match,
* then it will get output at the wrong scale. Setting a magnification
* factor on the instance when generating output might (?) work. For
* now, prohibiting a GDS read in read-only mode when the database units
* don't match. This forces the user either to reconsider the read-only
* status or to rewrite the GDS at a compatible scalefactor.
*/
compatible = TRUE;
if (CalmaReadOnly == TRUE)
{
if (CIFCurStyle->cs_flags & CWF_ANGSTROMS)
{
if ((int)(0.5 + metersPerDBUnit * 1e12) != 100)
{
CalmaReadError("Incompatible scale factor of %g, must be 1e-10.\n",
metersPerDBUnit);
TxError("Cannot read this file in read-only mode.\n");
return FALSE;
}
}
else
{
if ((int)(0.5 + metersPerDBUnit * 1e11) != 100)
{
CalmaReadError("Incompatible scale factor of %g, must be 1e-9.\n",
metersPerDBUnit);
TxError("Cannot read this file in read-only mode.\n");
return FALSE;
}
}
}
#ifdef notdef
TxPrintf("1 database unit equals %e user units\n", userUnitsPerDBUnit);
TxPrintf("1 database unit equals %e meters\n", metersPerDBUnit);
@ -459,9 +410,11 @@ calmaParseUnits(void)
*/
void
CalmaReadError(const char *format, ...)
/*VARARGS1*/
CalmaReadError(format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
char *format;
char *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8, *a9, *a10;
{
va_list args;
OFFTYPE filepos;
calmaTotalErrors++;
@ -479,18 +432,15 @@ CalmaReadError(const char *format, ...)
cifReadCellDef->cd_name);
fprintf(calmaErrorFile, "(byte position %"DLONG_PREFIX"d): ",
(dlong)filepos);
va_start(args, format);
Vfprintf(calmaErrorFile, format, args);
va_end(args);
fprintf(calmaErrorFile, format, a1, a2, a3, a4, a5, a6, a7,
a8, a9, a10);
}
}
else
{
TxError("Error while reading cell \"%s\" ", cifReadCellDef->cd_name);
TxError("(byte position %"DLONG_PREFIX"d): ", (dlong)filepos);
va_start(args, format);
TxErrorV(format, args);
va_end(args);
TxError(format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
}
}
else if ((calmaTotalErrors == 100) && (CIFWarningLevel == CIF_WARN_LIMIT))
@ -516,9 +466,9 @@ CalmaReadError(const char *format, ...)
*/
void
calmaUnexpected(
int wanted, /* Type of record we wanted */
int got) /* Type of record we got */
calmaUnexpected(wanted, got)
int wanted; /* Type of record we wanted */
int got; /* Type of record we got */
{
CalmaReadError("Unexpected record type in input: \n");
@ -558,12 +508,12 @@ calmaUnexpected(
* ----------------------------------------------------------------------------
*/
const char *
calmaRecordName(
int rtype)
char *
calmaRecordName(rtype)
int rtype;
{
static char numeric[10];
static const char * const calmaRecordNames[] =
static char *calmaRecordNames[] =
{
"HEADER", "BGNLIB", "LIBNAME", "UNITS",
"ENDLIB", "BGNSTR", "STRNAME", "ENDSTR",
@ -608,28 +558,25 @@ calmaRecordName(
*/
void
CalmaTechInit(void)
CalmaTechInit()
{
ASSERT(sizeof(FourByteInt)==4, "definition in calmaInt.h");
ASSERT(sizeof(TwoByteInt)==2, "definition in calmaInt.h");
/* NOTE: Add "$$*$$" to the default "flatglob" value */
/* when CalmaContactArrays behaves like the non-arrayed */
/* function and can be enabled by default. */
/* NOTE: Enable the code below when CalmaContactArrays */
/* behaves like the non-arrayed function and can be enabled */
/* by default. */
#if 0
/* Initialize CalmaFlattenByName to have one entry for */
/* "*_CDNS_*" to match the name style used by many foundry */
/* cells and which corresponds to pcells that often split */
/* layers between cells in ways that magic can't cope with; */
/* and whose original parameterized functions cannot be */
/* recovered by magic anyway. When necessary, this default */
/* can be overridden by the "gds flatglob none" command */
/* option. */
/* "$$*$$" to match the name style used by the contact */
/* array cell generation. This can be overridden by the */
/* "gds flatglob none" command option. */
if (CalmaFlattenUsesByName == (char **)NULL)
{
CalmaFlattenUsesByName = (char **)mallocMagic(2 * sizeof(char *));
*CalmaFlattenUsesByName = StrDup((char **)NULL, "*_CDNS_*");
*CalmaFlattenUsesByName = StrDup((char **)NULL, "$$*$$");
*(CalmaFlattenUsesByName + 1) = NULL;
}
#endif
}

File diff suppressed because it is too large Load Diff

View File

@ -25,7 +25,7 @@
*/
#ifndef lint
static const char rcsid[] __attribute__ ((unused)) ="$Header: /usr/cvsroot/magic-8.0/calma/CalmaWrite.c,v 1.8 2010/12/22 16:29:06 tim Exp $";
static char rcsid[] __attribute__ ((unused)) ="$Header: /usr/cvsroot/magic-8.0/calma/CalmaWrite.c,v 1.8 2010/12/22 16:29:06 tim Exp $";
#endif /* not lint */
#ifdef HAVE_ZLIB
@ -34,19 +34,13 @@ static const char rcsid[] __attribute__ ((unused)) ="$Header: /usr/cvsroot/magic
#include <stdint.h>
#include <stdlib.h> /* for random() */
#include <string.h>
#include <strings.h>
#include <ctype.h>
#include <sys/types.h>
#include <arpa/inet.h> /* for htons() */
#ifdef TIME_WITH_SYS_TIME
# include <sys/time.h>
# include <time.h>
#ifdef SYSV
#include <time.h>
#else
# ifdef HAVE_SYS_TIME_H
# include <sys/time.h>
# else
# include <time.h>
# endif
#include <sys/time.h>
#endif
#include "utils/magic.h"
@ -54,7 +48,6 @@ static const char rcsid[] __attribute__ ((unused)) ="$Header: /usr/cvsroot/magic
#include "utils/geometry.h"
#include "tiles/tile.h"
#include "utils/utils.h"
#include "utils/magic_zlib.h"
#include "utils/hash.h"
#include "database/database.h"
#include "database/databaseInt.h"
@ -67,7 +60,6 @@ static const char rcsid[] __attribute__ ((unused)) ="$Header: /usr/cvsroot/magic
#include "utils/styles.h"
#include "textio/textio.h"
#include "calma/calmaInt.h"
#include "extract/extractInt.h" /* for LabelList */
#include "utils/main.h" /* for Path and CellLibPath */
#include "utils/stack.h"
@ -96,31 +88,32 @@ extern int calmaPaintLayerNumber;
extern int calmaPaintLayerType;
/* External functions from CalmaWrite.c */
extern int calmaWriteInitFunc(CellDef *def, ClientData cdata); /* UNUSED */
extern int calmaWriteInitFunc();
extern int calmaWriteMarkFunc();
/* Forward declarations */
extern int calmaWritePaintFuncZ();
extern int calmaMergePaintFuncZ();
extern int calmaWriteUseFuncZ();
extern int calmaPaintLabelFuncZ();
extern void calmaWriteContactsZ();
extern void calmaOutFuncZ();
extern void calmaOutStructNameZ();
extern void calmaWriteLabelFuncZ();
extern void calmaOutHeaderZ();
extern void calmaOutDateZ();
extern void calmaOutStringRecordZ();
extern void calmaOut8Z();
extern void calmaOutR8Z();
/* Structure used by calmaWritePaintFuncZ() and others */
typedef struct {
gzFile f; /* Compressed file stream for output */
const Rect *area; /* Clipping area, in GDS coordinates */
Rect *area; /* Clipping area, in GDS coordinates */
int type; /* Layer index */
} calmaOutputStructZ;
/* Forward declarations */
extern int calmaWritePaintFuncZ(Tile *tile, TileType dinfo, calmaOutputStructZ *cos);
extern int calmaMergePaintFuncZ(Tile *tile, TileType dinfo, calmaOutputStructZ *cos);
extern int calmaWriteUseFuncZ(CellUse *use, gzFile f);
extern int calmaPaintLabelFuncZ(Tile *tile, TileType dinfo, calmaOutputStructZ *cos);
extern void calmaWriteContactsZ(gzFile f);
extern void calmaOutFuncZ(CellDef *def, gzFile f, const Rect *cliprect);
extern void calmaOutStructNameZ(int type, CellDef *def, gzFile f);
extern void calmaWriteLabelFuncZ(Label *lab, int ltype, int type, gzFile f);
extern void calmaOutHeaderZ(CellDef *rootDef, gzFile f);
extern void calmaOutDateZ(time_t t, gzFile f);
extern void calmaOutStringRecordZ(int type, char *str, gzFile f);
extern void calmaOut8Z(const char *str, gzFile f);
extern void calmaOutR8Z(double d, gzFile f);
/*--------------------------------------------------------------*/
/* Structures used by the tile merging algorithm */
/*--------------------------------------------------------------*/
@ -129,12 +122,28 @@ extern void calmaOutR8Z(double d, gzFile f);
#define GDS_UNPROCESSED CLIENTDEFAULT
#define GDS_PROCESSED 1
#define PUSHTILEZ(tp) \
if (TiGetClient(tp) == GDS_UNPROCESSED) { \
TiSetClientINT(tp, GDS_PENDING); \
#define PUSHTILE(tp) \
if ((tp)->ti_client == (ClientData) GDS_UNPROCESSED) { \
(tp)->ti_client = (ClientData) GDS_PENDING; \
STACKPUSH((ClientData) (tp), SegStack); \
}
#define LB_EXTERNAL 0 /* Polygon external edge */
#define LB_INTERNAL 1 /* Polygon internal edge */
#define LB_INIT 2 /* Data not yet valid */
typedef struct LB1 {
char lb_type; /* Boundary Type (external or internal) */
Point lb_start; /* Start point */
struct LB1 *lb_next; /* Next point record */
} LinkedBoundary;
typedef struct BT1 {
LinkedBoundary *bt_first; /* Polygon list */
int bt_points; /* Number of points in this list */
struct BT1 *bt_next; /* Next polygon record */
} BoundaryTop;
/* -------------------------------------------------------------------- */
/*
@ -186,7 +195,7 @@ extern void calmaOutR8Z(double d, gzFile f);
(void) gzputc(f, u.u_c[3]); \
}
static const char calmaMapTableStrict[] =
static char calmaMapTableStrict[] =
{
0, 0, 0, 0, 0, 0, 0, 0, /* NUL - BEL */
0, 0, 0, 0, 0, 0, 0, 0, /* BS - SI */
@ -206,7 +215,7 @@ static const char calmaMapTableStrict[] =
'x', 'y', 'z', '_', '_', '_', '_', 0, /* x - DEL */
};
static const char calmaMapTablePermissive[] =
static char calmaMapTablePermissive[] =
{
0, 0, 0, 0, 0, 0, 0, 0, /* NUL - BEL */
0, 0, 0, 0, 0, 0, 0, 0, /* BS - SI */
@ -261,13 +270,12 @@ static const char calmaMapTablePermissive[] =
*/
bool
CalmaWriteZ(
CellDef *rootDef, /* Pointer to CellDef to be written */
gzFile f) /* Open compressed output file */
CalmaWriteZ(rootDef, f)
CellDef *rootDef; /* Pointer to CellDef to be written */
gzFile f; /* Open compressed output file */
{
int oldCount = DBWFeedbackCount, problems, nerr;
bool good;
CellDef *err_def;
CellUse dummy;
HashEntry *he;
HashSearch hs;
@ -293,11 +301,9 @@ CalmaWriteZ(
*/
dummy.cu_def = rootDef;
err_def = DBCellReadArea(&dummy, &rootDef->cd_bbox, !CalmaAllowUndefined);
if (err_def != NULL)
if (DBCellReadArea(&dummy, &rootDef->cd_bbox, !CalmaAllowUndefined))
{
TxError("Failure to read entire subtree of the cell.\n");
TxError("Failed on cell %s.\n", err_def->cd_name);
return FALSE;
}
@ -359,7 +365,7 @@ CalmaWriteZ(
good = (nerr == 0) ? TRUE : FALSE;
/* See if any problems occurred */
if ((problems = (DBWFeedbackCount - oldCount)))
if (problems = (DBWFeedbackCount - oldCount))
TxPrintf("%d problems occurred. See feedback entries.\n", problems);
/*
@ -389,13 +395,13 @@ CalmaWriteZ(
*/
bool
calmaDumpStructureZ(
CellDef *def,
gzFile outf,
HashTable *calmaDefHash,
char *filename)
calmaDumpStructureZ(def, outf, calmaDefHash, filename)
CellDef *def;
gzFile outf;
HashTable *calmaDefHash;
char *filename;
{
int nbytes = -1, rtype = 0;
int nbytes, rtype;
char *strname = NULL, *newnameptr;
HashEntry *he, *he2;
CellDef *edef;
@ -508,7 +514,7 @@ calmaDumpStructureZ(
/* Is view abstract? */
DBPropGet(edef, "LEFview", &isAbstract);
chklibname = DBPropGetString(edef, "GDS_FILE", &isReadOnly);
chklibname = (char *)DBPropGet(edef, "GDS_FILE", &isReadOnly);
if (isAbstract && isReadOnly)
{
@ -659,11 +665,11 @@ syntaxerror:
*/
void
calmaFullDumpZ(
CellDef *def,
gzFile fi,
gzFile outf,
char *filename)
calmaFullDumpZ(def, fi, outf, filename)
CellDef *def;
gzFile fi;
gzFile outf;
char *filename;
{
int version, rval;
char *libname = NULL, *testlib, uniqlibname[4];
@ -673,10 +679,10 @@ calmaFullDumpZ(
HashSearch hs;
HashEntry *he, *he2;
static const int hdrSkip[] = { CALMA_FORMAT, CALMA_MASK, CALMA_ENDMASKS,
static int hdrSkip[] = { CALMA_FORMAT, CALMA_MASK, CALMA_ENDMASKS,
CALMA_REFLIBS, CALMA_FONTS, CALMA_ATTRTABLE,
CALMA_STYPTABLE, CALMA_GENERATIONS, -1 };
static const int skipBeforeLib[] = { CALMA_LIBDIRSIZE, CALMA_SRFNAME,
CALMA_STYPTABLE, CALMA_GENERATIONS, CALMA_UNITS, -1 };
static int skipBeforeLib[] = { CALMA_LIBDIRSIZE, CALMA_SRFNAME,
CALMA_LIBSECUR, -1 };
HashInit(&calmaDefHash, 32, 0);
@ -691,14 +697,10 @@ calmaFullDumpZ(
calmaSkipSet(skipBeforeLib);
if (!calmaReadStringRecord(CALMA_LIBNAME, &libname)) goto done;
// CALMA_UNITS needs to be parsed to determine if units in the
// input file are compatible with units being used in the output
// NOTE: CALMA_UNITS needs to be parsed to determine if units in
// the input file are compatible with units being used in the output
// file.
if (calmaParseUnits() == FALSE)
{
TxError("Error: Library %s has incompatible database units!\n", libname);
return;
}
calmaSkipSet(hdrSkip);
// Record the GDS library so it will not be processed again.
he = HashFind(&calmaLibHash, filename);
@ -716,7 +718,7 @@ calmaFullDumpZ(
* names in the GDS file do not shadow any names in the database.
*/
viewopts = DBPropGetString(def, "LEFview", &isAbstract);
viewopts = (char *)DBPropGet(def, "LEFview", &isAbstract);
if ((!isAbstract) || (strcasecmp(viewopts, "no_prefix")))
{
/* Generate a SHORT name for this cell (else it is easy to run into the
@ -807,18 +809,18 @@ done:
*/
int
calmaProcessUseZ(
CellUse *use, /* Process use->cu_def */
gzFile outf) /* Stream file */
calmaProcessUseZ(use, outf)
CellUse *use; /* Process use->cu_def */
gzFile outf; /* Stream file */
{
return (calmaProcessDefZ(use->cu_def, outf, FALSE));
}
int
calmaProcessDefZ(
CellDef *def, /* Output this def's children, then the def itself */
gzFile outf, /* Stream file */
bool do_library) /* If TRUE, output only children of def, but not def */
calmaProcessDefZ(def, outf, do_library)
CellDef *def; /* Output this def's children, then the def itself */
gzFile outf; /* Stream file */
bool do_library; /* If TRUE, output only children of def, but not def */
{
char *filename;
int polyidx;
@ -827,20 +829,23 @@ calmaProcessDefZ(
HashEntry *he;
/* Skip if already output */
if ((int) CD2INT(def->cd_client) > 0)
if ((int) def->cd_client > 0)
return (0);
/* Assign it a (negative) number if it doesn't have one yet */
if ((int) CD2INT(def->cd_client) == 0)
def->cd_client = INT2CD(calmaCellNum--);
if ((int) def->cd_client == 0)
def->cd_client = (ClientData) calmaCellNum--;
/* Mark this cell */
def->cd_client = INT2CD(- (int) CD2INT(def->cd_client));
def->cd_client = (ClientData) (- (int) def->cd_client);
/* Read the cell in if it is not already available. */
if ((def->cd_flags & CDAVAILABLE) == 0)
if (!DBCellRead(def, TRUE, TRUE, NULL))
{
bool dereference = (def->cd_flags & CDDEREFERENCE) ? TRUE : FALSE;
if (!DBCellRead(def, (char *) NULL, TRUE, dereference, NULL))
return (0);
}
/*
* Flag an error if attempting to write the default (UNNAMED) cell
@ -870,7 +875,7 @@ calmaProcessDefZ(
DBPropGet(def, "GDS_START", &hasContent);
DBPropGet(def, "GDS_END", &hasGDSEnd);
DBPropGet(def, "CIFhier", &needHier);
filename = DBPropGetString(def, "GDS_FILE", &isReadOnly);
filename = (char *)DBPropGet(def, "GDS_FILE", &isReadOnly);
/* When used with "calma addendum true", don't output the read-only */
/* cells. This makes the library incomplete and dependent on the */
@ -939,11 +944,6 @@ calmaProcessDefZ(
/* searched to find the .mag file that indicated this GDS file. */
fi = PaZOpen(filename, "r", "", Path, CellLibPath, &retfilename);
/* Check if file may have been compressed */
if (fi == NULL)
fi = PaZOpen(filename, "r", ".gz", Path, CellLibPath, &retfilename);
if (fi == NULL)
{
/* This is a rare error, but if the subcell is inside */
@ -985,12 +985,13 @@ calmaProcessDefZ(
}
else
{
cval = DBPropGetDouble(def, "GDS_END", NULL);
offptr = (char *)DBPropGet(def, "GDS_END", NULL);
sscanf(offptr, "%"DLONG_PREFIX"d", &cval);
cellend = (z_off_t)cval;
cval = DBPropGetDouble(def, "GDS_BEGIN", &oldStyle);
offptr = (char *)DBPropGet(def, "GDS_BEGIN", &oldStyle);
if (!oldStyle)
{
cval = DBPropGetDouble(def, "GDS_START", NULL);
offptr = (char *)DBPropGet(def, "GDS_START", NULL);
/* Write our own header and string name, to ensure */
/* that the magic cell name and GDS name match. */
@ -1007,6 +1008,7 @@ calmaProcessDefZ(
calmaOutStructNameZ(CALMA_STRNAME, def, outf);
}
sscanf(offptr, "%"DLONG_PREFIX"d", &cval);
cellstart = (z_off_t)cval;
/* GDS_START has been defined as the start of data after the cell */
@ -1047,7 +1049,6 @@ calmaProcessDefZ(
" Using magic's internal definition\n");
isReadOnly = FALSE;
}
freeMagic(buffer);
if (cellend < cellstart) /* Sanity check */
{
@ -1170,10 +1171,10 @@ calmaProcessDefZ(
*/
void
calmaOutFuncZ(
CellDef *def, /* Pointer to cell def to be written */
gzFile f, /* Open output file */
const Rect *cliprect)/* Area to clip to (used for contact cells),
calmaOutFuncZ(def, f, cliprect)
CellDef *def; /* Pointer to cell def to be written */
gzFile f; /* Open output file */
Rect *cliprect; /* Area to clip to (used for contact cells),
* in CIF/GDS coordinates.
*/
{
@ -1184,9 +1185,7 @@ calmaOutFuncZ(
int dbunits;
calmaOutputStructZ cos;
bool propfound;
PropertyRecord *proprec;
char *propvalue;
extern int compport(const void *one, const void *two); /* Forward declaration */
cos.f = f;
cos.area = (cliprect == &TiPlaneRect) ? NULL : cliprect;
@ -1246,20 +1245,14 @@ calmaOutFuncZ(
/* Include any fixed bounding box as part of the area to process, */
/* in case the fixed bounding box is larger than the geometry. */
proprec = DBPropGet(def, "FIXED_BBOX", &propfound);
propvalue = (char *)DBPropGet(def, "FIXED_BBOX", &propfound);
if (propfound)
{
Rect bbox;
if ((proprec->prop_type == PROPERTY_TYPE_DIMENSION) &&
(proprec->prop_len == 4))
{
bbox.r_xbot = proprec->prop_value.prop_integer[0];
bbox.r_ybot = proprec->prop_value.prop_integer[1];
bbox.r_xtop = proprec->prop_value.prop_integer[2];
bbox.r_ytop = proprec->prop_value.prop_integer[3];
if (sscanf(propvalue, "%d %d %d %d", &bbox.r_xbot, &bbox.r_ybot,
&bbox.r_xtop, &bbox.r_ytop) == 4)
GeoInclude(&bbox, &bigArea);
}
}
CIFErrorDef = def;
@ -1297,8 +1290,7 @@ calmaOutFuncZ(
if (CalmaDoLabels)
{
int i, ltype, numports = 0;
LabelList *ll = NULL, *newll;
int i, ltype, maxport = -1;
for (lab = def->cd_labels; lab; lab = lab->lab_next)
{
@ -1310,44 +1302,23 @@ calmaOutFuncZ(
}
else
{
newll = (LabelList *)mallocMagic(sizeof(LabelList));
newll->ll_label = lab;
newll->ll_attr = (unsigned int)lab->lab_port;
newll->ll_next = ll;
ll = newll;
numports++;
if ((int)lab->lab_port > maxport)
maxport = (int)lab->lab_port;
}
}
if (newll != NULL)
{
/* Turn linked list into an array, then run qsort on it */
/* to sort by port number. */
PortLabel *pllist = (PortLabel *)mallocMagic(numports * sizeof(PortLabel));
i = 0;
while (ll != NULL)
{
pllist[i].pl_label = ll->ll_label;
pllist[i].pl_port = (unsigned int)ll->ll_attr;
free_magic1_t mm1 = freeMagic1_init();
freeMagic1(&mm1, ll);
ll = ll->ll_next;
freeMagic1_end(&mm1);
i++;
}
qsort(pllist, numports, sizeof(PortLabel), compport);
for (i = 0; i < numports; i++)
{
lab = pllist[i].pl_label;
ltype = CIFCurStyle->cs_portText[lab->lab_type];
type = CIFCurStyle->cs_portLayer[lab->lab_type];
if (type >= 0)
calmaWriteLabelFuncZ(lab, ltype, type, f);
}
freeMagic(pllist);
}
if (maxport >= 0)
for (i = 0; i <= maxport; i++)
for (lab = def->cd_labels; lab; lab = lab->lab_next)
{
ltype = CIFCurStyle->cs_portText[lab->lab_type];
type = CIFCurStyle->cs_portLayer[lab->lab_type];
if ((type >= 0) && ((lab->lab_flags & PORT_DIR_MASK) != 0) &&
(lab->lab_port == i))
{
calmaWriteLabelFuncZ(lab, ltype, type, f);
/* break; */ /* Do not limit to unique labels! */
}
}
}
/* End of structure */
@ -1374,9 +1345,9 @@ calmaOutFuncZ(
*/
int
calmaWriteUseFuncZ(
CellUse *use,
gzFile f)
calmaWriteUseFuncZ(use, f)
CellUse *use;
gzFile f;
{
/*
* r90, r180, and r270 are Calma 8-byte real representations
@ -1384,10 +1355,10 @@ calmaWriteUseFuncZ(
* only 4 possible values, it is faster to have them pre-computed
* than to format with calmaOutR8Z().
*/
static const unsigned char r90[] = { 0x42, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
static const unsigned char r180[] = { 0x42, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
static const unsigned char r270[] = { 0x43, 0x10, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00 };
const unsigned char *whichangle;
static unsigned char r90[] = { 0x42, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
static unsigned char r180[] = { 0x42, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
static unsigned char r270[] = { 0x43, 0x10, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00 };
unsigned char *whichangle;
int x, y, topx, topy, rows, cols, xxlate, yxlate, hdrsize;
int rectype, stransflags;
Transform *t;
@ -1461,7 +1432,7 @@ calmaWriteUseFuncZ(
if (whichangle)
{
calmaOutRHZ(12, CALMA_ANGLE, CALMA_R8, f);
calmaOut8Z((char *)whichangle, f);
calmaOut8Z(whichangle, f);
}
/* Translation */
@ -1498,7 +1469,7 @@ calmaWriteUseFuncZ(
if (whichangle)
{
calmaOutRHZ(12, CALMA_ANGLE, CALMA_R8, f);
calmaOut8Z((char *)whichangle, f);
calmaOut8Z(whichangle, f);
}
/* If array, number of columns and rows in the array */
@ -1589,16 +1560,16 @@ calmaWriteUseFuncZ(
*/
void
calmaOutStructNameZ(
int type,
CellDef *def,
gzFile f)
calmaOutStructNameZ(type, def, f)
int type;
CellDef *def;
gzFile f;
{
char *defname;
unsigned char c;
char *cp;
int calmanum;
const char *table;
char *table;
if (CIFCurStyle->cs_flags & CWF_PERMISSIVE_LABELS)
{
@ -1608,7 +1579,7 @@ calmaOutStructNameZ(
}
/* Is the def name a legal Calma name? */
for (cp = def->cd_name; (c = (unsigned char) *cp); cp++)
for (cp = def->cd_name; c = (unsigned char) *cp; cp++)
{
if ((c > 127) || (table[c] == 0))
goto bad;
@ -1629,7 +1600,7 @@ calmaOutStructNameZ(
{
/* Bad name: use XXXXXcalmaNum */
bad:
calmanum = (int) CD2INT(def->cd_client);
calmanum = (int) def->cd_client;
if (calmanum < 0) calmanum = -calmanum;
defname = (char *)mallocMagic(32);
(void) sprintf(defname, "XXXXX%d", calmanum);
@ -1658,16 +1629,14 @@ bad:
*/
bool
CalmaGenerateArrayZ(
gzFile f, /* GDS output file */
TileType type, /* Magic tile type of contact */
int llx,
int lly, /* Lower-left hand coordinate of the array
CalmaGenerateArrayZ(f, type, llx, lly, pitch, cols, rows)
gzFile f; /* GDS output file */
TileType type; /* Magic tile type of contact */
int llx, lly; /* Lower-left hand coordinate of the array
* (centered on contact cut)
*/
int pitch, /* Pitch of the array elements */
int cols,
int rows) /* Number of array elements in X and Y */
int pitch; /* Pitch of the array elements */
int cols, rows; /* Number of array elements in X and Y */
{
CellDef *child; /* Cell definition of the contact cell */
int xxlate, yxlate;
@ -1728,8 +1697,8 @@ CalmaGenerateArrayZ(
*/
void
calmaWriteContactsZ(
gzFile f)
calmaWriteContactsZ(f)
gzFile f;
{
TileType type;
TileTypeBitMask tMask, *rMask;
@ -1768,7 +1737,7 @@ calmaWriteContactsZ(
/* Get clip bounds, so that residue surround is */
/* minimum. Note that these values are in CIF/GDS */
/* units, and the clipping rectangle passed to */
/* calmaOutFuncZ is also in CIF/GDS units. */
/* calmaOutFunc is also in CIF/GDS units. */
halfsize = CIFGetContactSize(type, NULL, NULL, NULL) >> 1;
@ -1811,9 +1780,9 @@ calmaWriteContactsZ(
*/
void
calmaProcessBoundaryZ(
BoundaryTop *blist,
calmaOutputStructZ *cos)
calmaProcessBoundaryZ(blist, cos)
BoundaryTop *blist;
calmaOutputStructZ *cos;
{
gzFile f = cos->f;
LinkedBoundary *listtop, *lbref, *lbstop, *lbfree;
@ -1849,11 +1818,8 @@ calmaProcessBoundaryZ(
calmaOutI4Z(lbref->lb_start.p_y * calmaPaintScale, f);
chkcount++;
}
if (listtop != NULL)
{
calmaOutI4Z(listtop->lb_start.p_x * calmaPaintScale, f);
calmaOutI4Z(listtop->lb_start.p_y * calmaPaintScale, f);
}
calmaOutI4Z(listtop->lb_start.p_x * calmaPaintScale, f);
calmaOutI4Z(listtop->lb_start.p_y * calmaPaintScale, f);
if (chkcount != bounds->bt_points)
TxError("Points recorded=%d; Points written=%d\n",
@ -1864,27 +1830,19 @@ calmaProcessBoundaryZ(
/* Free the LinkedBoundary list */
lbref = listtop;
while (lbref->lb_next != listtop)
{
free_magic1_t mm1 = freeMagic1_init();
lbref = listtop;
while (lbref->lb_next != listtop)
{
freeMagic1(&mm1, lbref);
lbref = lbref->lb_next;
}
freeMagic1(&mm1, lbref);
freeMagic1_end(&mm1);
freeMagic(lbref);
lbref = lbref->lb_next;
}
freeMagic(lbref);
}
/* Free the BoundaryTop list */
{
free_magic1_t mm1 = freeMagic1_init();
for (bounds = blist; bounds != NULL; bounds = bounds->bt_next)
freeMagic1(&mm1, bounds);
freeMagic1_end(&mm1);
}
for (bounds = blist; bounds != NULL; bounds = bounds->bt_next)
freeMagic(bounds);
}
/*
@ -1902,13 +1860,12 @@ calmaProcessBoundaryZ(
*/
int
calmaMergePaintFuncZ(
Tile *tile, /* Tile to be written out. */
TileType dinfo, /* Split tile information (unused) */
calmaOutputStructZ *cos) /* Information needed by algorithm */
calmaMergePaintFuncZ(tile, cos)
Tile *tile; /* Tile to be written out. */
calmaOutputStructZ *cos; /* Information needed by algorithm */
{
gzFile f = cos->f;
const Rect *clipArea = cos->area;
Rect *clipArea = cos->area;
Tile *t, *tp;
TileType ttype;
int i, llx, lly, urx, ury, intedges, num_points, split_type;
@ -1920,25 +1877,26 @@ calmaMergePaintFuncZ(
BoundaryTop *bounds = NULL;
/* Quick check for tiles that have already been processed */
if (TiGetClientINT(tile) == GDS_PROCESSED) return 0;
if (tile->ti_client == (ClientData)GDS_PROCESSED) return 0;
if (SegStack == (Stack *)NULL)
SegStack = StackNew(64);
PUSHTILEZ(tile);
PUSHTILE(tile);
while (!StackEmpty(SegStack))
{
t = (Tile *) STACKPOP(SegStack);
if (TiGetClientINT(t) != GDS_PENDING) continue;
TiSetClientINT(t, GDS_PROCESSED);
if (t->ti_client != (ClientData)GDS_PENDING) continue;
t->ti_client = (ClientData)GDS_PROCESSED;
split_type = -1;
if (IsSplit(t))
{
/* If we use TT_SIDE, then we need to set it when the */
/* If we use SplitSide, then we need to set it when the */
/* tile is pushed. Since these are one-or-zero mask layers */
/* I assume it is okay to just check which side is TT_SPACE */
/* split_type = (SplitSide(t) << 1) | SplitDirection(t); */
split_type = SplitDirection(t);
if (TiGetLeftType(t) == TT_SPACE) split_type |= 2;
num_points = 2;
@ -1950,10 +1908,8 @@ calmaMergePaintFuncZ(
lb = edge;
while (lb->lb_next != edge) lb = lb->lb_next;
lb->lb_next = edge->lb_next;
free_magic1_t mm1 = freeMagic1_init();
freeMagic1(&mm1, edge);
freeMagic(edge);
edge = edge->lb_next;
freeMagic1_end(&mm1);
}
}
else
@ -2094,7 +2050,7 @@ calmaMergePaintFuncZ(
intedges += calmaAddSegment(&lb, is_ext,
MIN(RIGHT(t), RIGHT(tp)), TOP(t),
MAX(LEFT(t), LEFT(tp)), TOP(t));
if (!is_ext) PUSHTILEZ(tp);
if (!is_ext) PUSHTILE(tp);
}
if (split_type == 0x3)
@ -2114,7 +2070,7 @@ left_search:
intedges += calmaAddSegment(&lb, is_ext,
LEFT(t), MIN(TOP(t), TOP(tp)),
LEFT(t), MAX(BOTTOM(t), BOTTOM(tp)));
if (!is_ext) PUSHTILEZ(tp);
if (!is_ext) PUSHTILE(tp);
}
if (split_type == 0x0)
@ -2134,7 +2090,7 @@ bottom_search:
intedges += calmaAddSegment(&lb, is_ext,
MAX(LEFT(t), LEFT(tp)), BOTTOM(t),
MIN(RIGHT(t), RIGHT(tp)), BOTTOM(t));
if (!is_ext) PUSHTILEZ(tp);
if (!is_ext) PUSHTILE(tp);
}
if (split_type == 0x1)
@ -2153,7 +2109,7 @@ right_search:
intedges += calmaAddSegment(&lb, is_ext,
RIGHT(t), MAX(BOTTOM(t), BOTTOM(tp)),
RIGHT(t), MIN(TOP(t), TOP(tp)));
if (!is_ext) PUSHTILEZ(tp);
if (!is_ext) PUSHTILE(tp);
}
/* If tile is isolated, process it now and we're done */
@ -2161,9 +2117,7 @@ right_search:
done_searches:
if (intedges == 0)
{
calmaWritePaintFuncZ(t,
(split_type & 2) ? (TileType)TT_SIDE : (TileType)0,
cos);
calmaWritePaintFuncZ(t, cos);
/* Although calmaWritePaintFunc is called only on isolated */
/* tiles, we may have expanded it. This could use a LOT of */
@ -2174,13 +2128,11 @@ done_searches:
if (num_points != 4)
{
free_magic1_t mm1 = freeMagic1_init();
for (i = 0; i < num_points; i++)
{
freeMagic1(&mm1, edge);
freeMagic(edge);
edge = edge->lb_next;
}
freeMagic1_end(&mm1);
edge = NULL;
}
if (!StackEmpty(SegStack))
@ -2231,13 +2183,12 @@ done_searches:
*/
int
calmaWritePaintFuncZ(
Tile *tile, /* Tile to be written out. */
TileType dinfo, /* Split tile information */
calmaOutputStructZ *cos) /* File for output and clipping area */
calmaWritePaintFuncZ(tile, cos)
Tile *tile; /* Tile to be written out. */
calmaOutputStructZ *cos; /* File for output and clipping area */
{
gzFile f = cos->f;
const Rect *clipArea = cos->area;
Rect *clipArea = cos->area;
Rect r, r2;
TiToRect(tile, &r);
@ -2269,7 +2220,7 @@ calmaWritePaintFuncZ(
/* Coordinates */
calmaOutRHZ(36, CALMA_XY, CALMA_I4, f);
switch (((dinfo & TT_SIDE) ? 2 : 0) | SplitDirection(tile))
switch ((SplitSide(tile) << 1) | SplitDirection(tile))
{
case 0x0:
calmaOutI4Z(r.r_xbot, f); calmaOutI4Z(r.r_ybot, f);
@ -2337,13 +2288,13 @@ calmaWritePaintFuncZ(
*/
void
calmaWriteLabelFuncZ(
Label *lab, /* Label to output */
int ltype, /* CIF layer number to use for TEXT record */
int type, /* CIF layer number to use for BOUNDARY record,
calmaWriteLabelFuncZ(lab, ltype, type, f)
Label *lab; /* Label to output */
int ltype; /* CIF layer number to use for TEXT record */
int type; /* CIF layer number to use for BOUNDARY record,
* or -1 if not attached to a layer
*/
gzFile f) /* Stream file */
gzFile f; /* Stream file */
{
Point p;
int calmanum, calmatype;
@ -2508,13 +2459,12 @@ calmaWriteLabelFuncZ(
*/
int
calmaPaintLabelFuncZ(
Tile *tile, /* Tile contains area for label. */
TileType dinfo, /* Split tile information (unused) */
calmaOutputStructZ *cos) /* File for output and clipping area */
calmaPaintLabelFuncZ(tile, cos)
Tile *tile; /* Tile contains area for label. */
calmaOutputStructZ *cos; /* File for output and clipping area */
{
gzFile f = cos->f;
const Rect *clipArea = cos->area;
Rect *clipArea = cos->area;
Rect r, r2;
Point p;
int len;
@ -2570,9 +2520,9 @@ calmaPaintLabelFuncZ(
*/
void
calmaOutHeaderZ(
CellDef *rootDef,
gzFile f)
calmaOutHeaderZ(rootDef, f)
CellDef *rootDef;
gzFile f;
{
static double useru = 0.001;
static double mum = 1.0e-9;
@ -2631,9 +2581,9 @@ calmaOutHeaderZ(
*/
void
calmaOutDateZ(
time_t t, /* Time (UNIX format) to be output */
gzFile f) /* Stream file */
calmaOutDateZ(t, f)
time_t t; /* Time (UNIX format) to be output */
gzFile f; /* Stream file */
{
struct tm *datep = localtime(&t);
@ -2666,15 +2616,14 @@ calmaOutDateZ(
*/
void
calmaOutStringRecordZ(
int type, /* Type of this record (data type is ASCII string) */
char *str, /* String to be output */
gzFile f) /* Compressed stream file */
calmaOutStringRecordZ(type, str, f)
int type; /* Type of this record (data type is ASCII string) */
char *str; /* String to be output */
gzFile f; /* Compressed stream file */
{
int len;
unsigned char c;
const char *table;
char *locstr, *origstr = NULL;
char *table, *locstr, *origstr = NULL;
char *locstrprv;
if(CIFCurStyle->cs_flags & CWF_PERMISSIVE_LABELS)
@ -2768,9 +2717,9 @@ calmaOutStringRecordZ(
*/
void
calmaOutR8Z(
double d, /* Double value to write to output */
gzFile f) /* Stream file */
calmaOutR8Z(d, f)
double d; /* Double value to write to output */
gzFile f; /* Stream file */
{
int c, i, sign, expon;
@ -2843,9 +2792,9 @@ calmaOutR8Z(
*/
void
calmaOut8Z(
const char *str, /* 8-byte string to be output */
gzFile f) /* Compressed stream file */
calmaOut8Z(str, f)
char *str; /* 8-byte string to be output */
gzFile f; /* Compressed stream file */
{
int i;

View File

@ -19,8 +19,8 @@
* rcsid $Header: /usr/cvsroot/magic-8.0/calma/calma.h,v 1.1.1.1 2008/02/03 20:43:50 tim Exp $
*/
#ifndef _MAGIC__CALMA__CALMA_H
#define _MAGIC__CALMA__CALMA_H
#ifndef _CALMA_H
#define _CALMA_H
#include "utils/magic.h"
@ -38,10 +38,7 @@ extern TileTypeBitMask *CalmaMaskHints;
extern bool CalmaMergeTiles;
extern bool CalmaFlattenArrays;
extern bool CalmaNoDRCCheck;
extern bool CalmaRecordPaths;
extern bool CalmaFlattenUses;
extern int CalmaFlattenLimit;
extern float CalmaMagScale;
extern char **CalmaFlattenUsesByName;
extern bool CalmaReadOnly;
extern bool CalmaContactArrays;
@ -62,42 +59,43 @@ extern bool CalmaAllowAbstract;
#define CALMA_POLYGON_KEEP 2
/* Externally-visible procedures: */
extern bool CalmaWrite(CellDef *rootDef, FILE *f);
extern void CalmaReadFile(FILETYPE file, char *filename);
extern void CalmaTechInit(void);
extern bool CalmaGenerateArray(FILE *f, TileType type, int llx, int lly, int pitch, int cols, int rows);
extern void CalmaReadError(const char *format, ...) ATTR_FORMAT_PRINTF_1;
extern bool CalmaWrite();
extern void CalmaReadFile();
extern void CalmaTechInit();
extern bool CalmaGenerateArray();
extern void CalmaReadError();
/* C99 compat */
extern void calmaDelContacts(void);
extern void calmaElementBoundary(void);
extern void calmaElementBox(void);
extern void calmaElementPath(void);
extern void calmaElementText(void);
extern bool calmaIsUseNameDefault(char *defName, char *useName);
extern bool calmaParseStructure(char *filename);
extern int calmaProcessDef(CellDef *def, FILE *outf, bool do_library);
#ifdef HAVE_ZLIB
extern int calmaProcessDefZ(CellDef *def, gzFile outf, bool do_library);
#endif
extern bool calmaReadI2Record(int type, int *pvalue);
extern bool calmaReadI4Record(int type, int *pvalue);
extern void calmaReadX(Point *p, int iscale);
extern void calmaReadY(Point *p, int iscale);
extern void calmaReadPoint(Point *p, int iscale);
extern bool calmaReadR8(double *pd);
extern bool calmaReadStampRecord(int type, int *stampptr);
extern bool calmaReadStringRecord(int type, char **str);
extern bool calmaReadStringRecord(int type, char **str);
extern bool calmaReadTransform(Transform *ptrans, char *name);
extern bool calmaSkipBytes(int nbytes);
extern bool calmaSkipExact(int type);
extern bool calmaSkipTo(int what);
extern void calmaUnexpected(int wanted, int got);
extern void CalmaReadError();
extern int calmaAddSegment();
extern void calmaDelContacts();
extern void calmaElementBoundary();
extern void calmaElementBox();
extern void calmaElementPath();
extern void calmaElementText();
extern bool calmaIsUseNameDefault();
extern bool calmaParseStructure();
extern int calmaProcessDef();
extern int calmaProcessDefZ();
extern bool calmaReadI2Record();
extern bool calmaReadI4Record();
extern void calmaReadPoint();
extern bool calmaReadR8();
extern bool calmaReadStampRecord();
extern bool calmaReadStringRecord();
extern bool calmaReadStringRecord();
extern bool calmaReadTransform();
extern bool calmaSkipBytes();
extern bool calmaSkipExact();
extern bool calmaSkipTo();
extern void calmaUnexpected();
extern void calmaMergeSegments();
extern void calmaRemoveDegenerate();
extern void calmaRemoveColinear();
#ifdef HAVE_ZLIB
extern bool CalmaWriteZ(CellDef *rootDef, gzFile f);
extern bool CalmaGenerateArrayZ(gzFile f, TileType type, int llx, int lly, int pitch, int cols, int rows);
extern bool CalmaWriteZ();
extern bool CalmaGenerateArrayZ();
#endif
#endif /* _MAGIC__CALMA__CALMA_H */
#endif /* _CALMA_H */

View File

@ -19,8 +19,8 @@
* rcsid $Header: /usr/cvsroot/magic-8.0/calma/calmaInt.h,v 1.2 2010/06/24 12:37:15 tim Exp $
*/
#ifndef _MAGIC__CALMA__CALMAINT_H
#define _MAGIC__CALMA__CALMAINT_H
#ifndef _CALMAINT_H
#define _CALMAINT_H
#include "utils/magic.h"
#include "database/database.h"
@ -131,11 +131,8 @@ typedef struct
/* Length of record header */
#define CALMAHEADERLENGTH 4
/* Label types
* The intention is all the values can be stored/converted with unsigned char type,
* C23 allows us to be explicit with the type but C99 does not, so a comment for now.
*/
typedef enum /* : unsigned char */ { LABEL_TYPE_NONE, LABEL_TYPE_TEXT, LABEL_TYPE_PORT, LABEL_TYPE_CELLID } labelType;
/* Label types */
typedef enum { LABEL_TYPE_NONE, LABEL_TYPE_TEXT, LABEL_TYPE_PORT, LABEL_TYPE_CELLID } labelType;
/* ------------------------- Input macros ----------------------------- */
@ -219,52 +216,19 @@ typedef union { char uc[4]; unsigned int ul; } FourByteInt;
UNREADRH(nb, rt); \
}
/* Structure used for sorting ports by number */
typedef struct portlabel
{
Label *pl_label;
unsigned int pl_port;
} PortLabel;
/* Other commonly used globals */
extern HashTable calmaLayerHash;
extern const int calmaElementIgnore[];
extern CellDef *calmaFindCell(const char *name, bool *was_called, bool *predefined);
extern int calmaElementIgnore[];
extern CellDef *calmaFindCell();
/* (Added by Nishit, 8/18/2004--8/24/2004) */
extern CellDef *calmaLookCell(char *name);
extern void calmaWriteContacts(FILE *f);
extern CellDef *calmaGetContactCell(TileType type, bool lookOnly);
extern CellDef *calmaLookCell();
extern void calmaWriteContact();
extern CellDef *calmaGetContactCell();
extern bool calmaIsContactCell;
extern const char *calmaRecordName(int rtype);
extern void calmaSkipSet(const int *skipwhat);
extern bool calmaParseUnits(void);
extern int compport(const void *one, const void *two);
#define LB_EXTERNAL 0 /* Polygon external edge */
#define LB_INTERNAL 1 /* Polygon internal edge */
#define LB_INIT 2 /* Data not yet valid */
typedef struct LB1 {
char lb_type; /* Boundary Type (external or internal) */
Point lb_start; /* Start point */
struct LB1 *lb_next; /* Next point record */
} LinkedBoundary;
typedef struct BT1 {
LinkedBoundary *bt_first; /* Polygon list */
int bt_points; /* Number of points in this list */
struct BT1 *bt_next; /* Next polygon record */
} BoundaryTop;
extern int calmaAddSegment(LinkedBoundary **lbptr, bool poly_edge, int p1x, int p1y, int p2x, int p2y);
extern void calmaMergeSegments(LinkedBoundary *edge, BoundaryTop **blist, int num_points);
extern void calmaRemoveDegenerate(BoundaryTop *blist);
extern void calmaRemoveColinear(BoundaryTop *blist);
extern char *calmaRecordName();
extern void calmaSkipSet();
/* ------------------- Imports from CIF reading ----------------------- */
@ -274,4 +238,4 @@ extern Plane **cifCurReadPlanes;
extern HashTable CifCellTable;
extern Plane *cifEditCellPlanes[];
#endif /* _MAGIC__CALMA__CALMAINT_H */
#endif /* _CALMAINT_H */

File diff suppressed because it is too large Load Diff

View File

@ -22,7 +22,7 @@
*/
#ifndef lint
static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cif/CIFhier.c,v 1.3 2010/06/24 12:37:15 tim Exp $";
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cif/CIFhier.c,v 1.3 2010/06/24 12:37:15 tim Exp $";
#endif /* not lint */
#include <stdio.h>
@ -107,7 +107,7 @@ static CIFLayer *CurCifLayer;
*/
void
CIFInitCells(void)
CIFInitCells()
{
int i;
@ -172,7 +172,7 @@ CIFInitCells(void)
*/
void
cifHierCleanup(void)
cifHierCleanup()
{
int i;
@ -209,41 +209,52 @@ typedef struct _maskHintsData
{
Transform *mh_trans;
CellDef *mh_def;
Plane *mh_plane;
} MaskHintsData;
/*
* ----------------------------------------------------------------------------
*
* cifCopyMaskHintFunc --
* cifMaskHints --
*
* Callback function used by cifFlatMaskHints. Transforms a tile
* from the original plane and paints it into the target plane,
* both of which are properties.
* Copy a mask hint into a target cell by adding it to the
* property list of the target cell. If the target cell already
* has the same mask hint key, then the mask hint value is
* appended to the property in the target cell def.
*
* Results:
* Zero to keep the search going.
* Returns:
* 0 to keep the search going.
*
* Side effects:
* Paints geometry into the target plane.
* Modifies properties of the target cell def.
*
* ----------------------------------------------------------------------------
*/
/* DEPRECATED */
int
cifCopyMaskHintFunc(Tile *tile,
TileType dinfo,
ClientData cdata)
cifMaskHints(name, value, targetDef)
char *name;
char *value;
CellDef *targetDef;
{
MaskHintsData *mhd = (MaskHintsData *)cdata;
Rect r, newr;
char *propvalue, *newval;
bool propfound;
TiToRect(tile, &r);
/* Transform tile area to coordinates of mhd->mh_plane and paint */
GeoTransRect(mhd->mh_trans, &r, &newr);
DBPaintPlane(mhd->mh_plane, &newr, CIFPaintTable, (PaintUndoInfo *)NULL);
if (!strncmp(name, "MASKHINTS_", 10))
{
/* Check if name exists already in the flattened cell */
propvalue = (char *)DBPropGet(targetDef, name, &propfound);
if (propfound)
{
/* Append value to the property */
newval = mallocMagic(strlen(value) + strlen(propvalue) + 2);
sprintf(newval, "%s %s", propvalue, value);
}
else
newval = StrDup((char **)NULL, value);
DBPropPut(targetDef, name, newval);
}
return 0;
}
@ -253,8 +264,8 @@ cifCopyMaskHintFunc(Tile *tile,
* cifFlatMaskHints --
*
* Copy a mask hint into a flattened cell by transforming it into the
* coordinate system of the flattened cell, and painting it into the
* property plane of the flattened cell.
* coordinate system of the flattened cell, and adding it to the
* property list of the flattened cell.
*
* Returns:
* 0 to keep the search going.
@ -266,42 +277,62 @@ cifCopyMaskHintFunc(Tile *tile,
*/
int
cifFlatMaskHints(
char *name,
PropertyRecord *proprec,
MaskHintsData *mhd)
cifFlatMaskHints(name, value, mhd)
char *name;
char *value;
MaskHintsData *mhd;
{
Rect r, newr;
char *vptr, *newval, *lastval, *propvalue;
bool propfound;
int i, lastlen, numvals;
PropertyRecord *newproprec, *oldproprec;
Plane *plane;
int lastlen;
if (!strncmp(name, "MASKHINTS_", 10))
{
/* Check if name exists already in the flattened cell */
oldproprec = (PropertyRecord *)DBPropGet(mhd->mh_def, name, &propfound);
if (propfound)
newval = (char *)NULL;
vptr = value;
while (*vptr != '\0')
{
ASSERT(oldproprec->prop_type == PROPERTY_TYPE_PLANE,
"cifFlatMaskHints");
plane = oldproprec->prop_value.prop_plane;
}
else
{
newproprec = (PropertyRecord *)mallocMagic(sizeof(PropertyRecord));
newproprec->prop_len = 0; /* (unused) */
newproprec->prop_type = PROPERTY_TYPE_PLANE;
plane = DBNewPlane((ClientData)TT_SPACE);
newproprec->prop_value.prop_plane = plane;
DBPropPut(mhd->mh_def, name, newproprec);
if (sscanf(vptr, "%d %d %d %d", &r.r_xbot, &r.r_ybot,
&r.r_xtop, &r.r_ytop) == 4)
{
/* Transform rectangle to top level coordinates */
GeoTransRect(mhd->mh_trans, &r, &newr);
lastval = newval;
lastlen = (lastval) ? strlen(lastval) : 0;
newval = mallocMagic(40 + lastlen);
if (lastval)
strcpy(newval, lastval);
else
*newval = '\0';
sprintf(newval + lastlen, "%s%d %d %d %d", (lastval) ? " " : "",
newr.r_xbot, newr.r_ybot, newr.r_xtop, newr.r_ytop);
if (lastval) freeMagic(lastval);
/* Parse through the four values and check if there's more */
while (*vptr && isspace(*vptr)) vptr++;
while (*vptr && !isspace(*vptr)) vptr++;
while (*vptr && isspace(*vptr)) vptr++;
while (*vptr && !isspace(*vptr)) vptr++;
while (*vptr && isspace(*vptr)) vptr++;
while (*vptr && !isspace(*vptr)) vptr++;
while (*vptr && isspace(*vptr)) vptr++;
while (*vptr && !isspace(*vptr)) vptr++;
while (*vptr && isspace(*vptr)) vptr++;
}
}
mhd->mh_plane = plane;
DBSrPaintArea((Tile *)NULL, proprec->prop_value.prop_plane,
&TiPlaneRect, &CIFSolidBits,
cifCopyMaskHintFunc, (ClientData)mhd);
/* Check if name exists already in the flattened cell */
propvalue = (char *)DBPropGet(mhd->mh_def, name, &propfound);
if (propfound)
{
/* Append newval to the property */
lastval = newval;
newval = mallocMagic(strlen(lastval) + strlen(propvalue) + 2);
sprintf(newval, "%s %s", propvalue, lastval);
freeMagic(lastval);
}
DBPropPut(mhd->mh_def, name, newval);
}
return 0;
}
@ -312,10 +343,9 @@ cifFlatMaskHints(
* CIFCopyMaskHints --
*
* Callback function to copy mask hints from one cell into another.
* (Occasionally called as a standalone function, not as a callback.)
*
* Results:
* Return 0 to keep the search going.
* None.
*
* Side effects:
* May modify properties in the target cell.
@ -323,19 +353,48 @@ cifFlatMaskHints(
* ----------------------------------------------------------------------------
*/
int
CIFCopyMaskHints(
SearchContext *scx,
CellDef *targetDef)
void
CIFCopyMaskHints(scx, targetDef)
SearchContext *scx;
CellDef *targetDef;
{
MaskHintsData mhd;
CellDef *sourceDef = scx->scx_use->cu_def;
mhd.mh_trans = &scx->scx_trans;
mhd.mh_def = targetDef;
mhd.mh_plane = (Plane *)NULL;
DBPropEnum(sourceDef, cifFlatMaskHints, &mhd);
}
/*
* ----------------------------------------------------------------------------
*
* cifHierCopyMaskHints --
*
* Callback function to copy mask hints from a subcell into a flattened
* cell, which is passed in the clientData record.
*
* Results:
* Always returns 0 to keep the search alive.
*
* Side effects:
* May modify properties in the flattened cell.
*
* ----------------------------------------------------------------------------
*/
int
cifHierCopyMaskHints(scx, clientData)
SearchContext *scx;
ClientData clientData;
{
MaskHintsData mhd;
mhd.mh_trans = &scx->scx_trans;
mhd.mh_def = (CellDef *)clientData;
DBPropEnum(scx->scx_use->cu_def, cifFlatMaskHints, &mhd);
return 0;
}
@ -365,18 +424,17 @@ CIFCopyMaskHints(
*/
int
cifHierCopyFunc(
Tile *tile, /* Pointer to tile to copy. */
TileType dinfo, /* Split tile information */
TreeContext *cxp) /* Describes context of search, including
cifHierCopyFunc(tile, cxp)
Tile *tile; /* Pointer to tile to copy. */
TreeContext *cxp; /* Describes context of search, including
* transform and client data.
*/
{
TileType type = TiGetTypeExact(tile) | dinfo;
TileType type = TiGetTypeExact(tile);
Rect sourceRect, targetRect;
int pNum;
CellDef *def = (CellDef *) cxp->tc_filter->tf_arg;
TileType newdinfo = 0;
int dinfo = 0;
/* Ignore tiles in vendor GDS, unless this is specifically */
/* overridden by the "see-vendor" option. */
@ -392,8 +450,8 @@ cifHierCopyFunc(
if (IsSplit(tile))
{
newdinfo = DBTransformDiagonal(type, &cxp->tc_scx->scx_trans);
type = (dinfo & TT_SIDE) ? SplitRightType(tile) :
dinfo = DBTransformDiagonal(type, &cxp->tc_scx->scx_trans);
type = (SplitSide(tile)) ? SplitRightType(tile) :
SplitLeftType(tile);
}
@ -408,7 +466,7 @@ cifHierCopyFunc(
{
if (DBPaintOnPlane(type, pNum))
{
DBNMPaintPlane(def->cd_planes[pNum], newdinfo, &targetRect,
DBNMPaintPlane(def->cd_planes[pNum], dinfo, &targetRect,
DBStdPaintTbl(type, pNum), (PaintUndoInfo *) NULL);
}
}
@ -435,8 +493,8 @@ cifHierCopyFunc(
*/
int
cifHierCellFunc(
SearchContext *scx) /* Describes cell and area in cell. */
cifHierCellFunc(scx)
SearchContext *scx; /* Describes cell and area in cell. */
{
SearchContext newscx;
Rect rootArea;
@ -460,7 +518,7 @@ cifHierCellFunc(
/* Flatten mask hints in the area of interest */
CIFCopyMaskHints(scx, CIFComponentDef);
DBTreeSrCells(&newscx, 0, CIFCopyMaskHints,
DBTreeSrCells(&newscx, 0, cifHierCopyMaskHints,
(ClientData)CIFComponentDef);
/* Set CIFErrorDef to NULL to ignore errors here... these will
@ -495,13 +553,11 @@ cifHierCellFunc(
*/
int
cifHierErrorFunc(
Tile *tile, /* Tile that covers area it shouldn't. */
TileType dinfo, /* Split tile information */
Rect *checkArea) /* Intersection of this and tile is error. */
cifHierErrorFunc(tile, checkArea)
Tile *tile; /* Tile that covers area it shouldn't. */
Rect *checkArea; /* Intersection of this and tile is error. */
{
Rect area;
bool side = (dinfo & TT_SIDE) ? TRUE : FALSE;
TiToRect(tile, &area);
@ -509,8 +565,8 @@ cifHierErrorFunc(
* space bounds the checkArea.
*/
if (IsSplit(tile))
if (((area.r_xbot == checkArea->r_xbot) && !side) ||
((area.r_xtop == checkArea->r_xtop) && side))
if (((area.r_xbot == checkArea->r_xbot) && !SplitSide(tile)) ||
((area.r_xtop == checkArea->r_xtop) && SplitSide(tile)))
return 0;
GeoClip(&area, checkArea);
@ -539,10 +595,9 @@ cifHierErrorFunc(
*/
int
cifHierCheckFunc(
Tile *tile, /* Tile containing CIF. */
TileType dinfo, /* Split tile information */
Plane *plane) /* Plane to check against and modify. */
cifHierCheckFunc(tile, plane)
Tile *tile; /* Tile containing CIF. */
Plane *plane; /* Plane to check against and modify. */
{
Rect area;
@ -550,10 +605,10 @@ cifHierCheckFunc(
if (IsSplit(tile))
{
DBSrPaintNMArea((Tile *)NULL, plane, TiGetTypeExact(tile) | dinfo,
DBSrPaintNMArea((Tile *)NULL, plane, TiGetTypeExact(tile),
&area, &DBSpaceBits, cifHierErrorFunc, (ClientData) &area);
DBNMPaintPlane(plane, TiGetTypeExact(tile) | dinfo, &area, CIFEraseTable,
DBNMPaintPlane(plane, TiGetTypeExact(tile), &area, CIFEraseTable,
(PaintUndoInfo *) NULL);
}
else
@ -587,17 +642,16 @@ cifHierCheckFunc(
*/
int
cifHierTempCheckFunc(
Tile *tile, /* Tile containing CIF. */
TileType dinfo, /* Information about split tiles */
Plane *plane) /* Plane to check against and modify. */
cifHierTempCheckFunc(tile, plane)
Tile *tile; /* Tile containing CIF. */
Plane *plane; /* Plane to check against and modify. */
{
Rect area;
TiToRect(tile, &area);
if (IsSplit(tile))
DBNMPaintPlane(plane, TiGetTypeExact(tile) | dinfo, &area, CIFEraseTable,
DBNMPaintPlane(plane, TiGetTypeExact(tile), &area, CIFEraseTable,
(PaintUndoInfo *) NULL);
else
DBPaintPlane(plane, &area, CIFEraseTable, (PaintUndoInfo *) NULL);
@ -623,19 +677,18 @@ cifHierTempCheckFunc(
*/
int
cifHierPaintFunc(
Tile *tile,
TileType dinfo, /* Information about split tiles */
Plane *plane) /* Plane in which to paint CIF over tile's
cifHierPaintFunc(tile, plane)
Tile *tile;
Plane *plane; /* Plane in which to paint CIF over tile's
* area.
*/
{
Rect area;
TiToRect(tile, &area);
if (CIFCurStyle->cs_flags & CWF_GROW_SLIVERS) cifGrowSliver(tile, dinfo, &area);
if (CIFCurStyle->cs_flags & CWF_GROW_SLIVERS) cifGrowSliver(tile, &area);
if (IsSplit(tile))
DBNMPaintPlane(plane, TiGetTypeExact(tile) | dinfo, &area, CIFPaintTable,
DBNMPaintPlane(plane, TiGetTypeExact(tile), &area, CIFPaintTable,
(PaintUndoInfo *) NULL);
else
DBPaintPlane(plane, &area, CIFPaintTable, (PaintUndoInfo *) NULL);
@ -665,8 +718,8 @@ cifHierPaintFunc(
*/
void
cifCheckAndErase(
CIFStyle *style) /* Describes how to make CIF. */
cifCheckAndErase(style)
CIFStyle *style; /* Describes how to make CIF. */
{
int i;
@ -706,10 +759,10 @@ cifCheckAndErase(
*/
void
CIFGenSubcells(
CellDef *def, /* Parent cell for which CIF is computed. */
Rect *area, /* All CIF in this area is interesting. */
Plane **output) /* Array of pointers to planes into which
CIFGenSubcells(def, area, output)
CellDef *def; /* Parent cell for which CIF is computed. */
Rect *area; /* All CIF in this area is interesting. */
Plane **output; /* Array of pointers to planes into which
* the CIF output will be OR'ed (real CIF
* only).
*/
@ -735,10 +788,8 @@ CIFGenSubcells(
/* This routine can take a long time, so use the display
* timer to force a 5-second progress check (like is done
* with extract). Save and restore GrDisplayStatus so that
* a headless (DISPLAY_SUSPEND) build isn't left in DISPLAY_IDLE.
* with extract)
*/
unsigned char savedDisplayStatus = GrDisplayStatus;
GrDisplayStatus = DISPLAY_IN_PROGRESS;
SigSetTimer(5); /* Print at 5-second intervals */
cuts = 0;
@ -790,7 +841,7 @@ CIFGenSubcells(
cifHierCopyFunc, (ClientData) CIFTotalDef);
/* Flatten mask hints in the area of interest */
CIFCopyMaskHints(&scx, CIFTotalDef);
DBTreeSrCells(&scx, 0, CIFCopyMaskHints,
DBTreeSrCells(&scx, 0, cifHierCopyMaskHints,
(ClientData)CIFTotalDef);
CIFErrorDef = def;
@ -863,7 +914,7 @@ CIFGenSubcells(
CIFHierTileOps += CIFTileOps - oldTileOps;
GrDisplayStatus = savedDisplayStatus;
GrDisplayStatus = DISPLAY_IDLE;
SigRemoveTimer();
UndoEnable();
@ -876,14 +927,13 @@ CIFGenSubcells(
*/
int
cifHierElementFuncLow(
CellUse *use, /* CellUse being array-checked. */
Transform *transform, /* Transform from this instance to
cifHierElementFuncLow(use, transform, x, y, checkArea)
CellUse *use; /* CellUse being array-checked. */
Transform *transform; /* Transform from this instance to
* the parent.
*/
int x,
int y, /* Indices of this instance. */
Rect *checkArea) /* Area (in parent coords) to be
int x, y; /* Indices of this instance. */
Rect *checkArea; /* Area (in parent coords) to be
* CIF-generated.
*/
{
@ -900,14 +950,13 @@ cifHierElementFuncLow(
*/
int
cifHierElementFuncHigh(
CellUse *use, /* CellUse being array-checked. */
Transform *transform, /* Transform from this instance to
cifHierElementFuncHigh(use, transform, x, y, checkArea)
CellUse *use; /* CellUse being array-checked. */
Transform *transform; /* Transform from this instance to
* the parent.
*/
int x,
int y, /* Indices of this instance. */
Rect *checkArea) /* Area (in parent coords) to be
int x, y; /* Indices of this instance. */
Rect *checkArea; /* Area (in parent coords) to be
* CIF-generated.
*/
{
@ -942,14 +991,13 @@ cifHierElementFuncHigh(
/* ARGSUSED */
int
cifHierElementFunc(
CellUse *use, /* CellUse being array-checked. */
Transform *transform, /* Transform from this instance to
cifHierElementFunc(use, transform, x, y, checkArea)
CellUse *use; /* CellUse being array-checked. */
Transform *transform; /* Transform from this instance to
* the parent.
*/
int x,
int y, /* Indices of this instance. */
Rect *checkArea) /* Area (in parent coords) to be
int x, y; /* Indices of this instance. */
Rect *checkArea; /* Area (in parent coords) to be
* CIF-generated.
*/
{
@ -968,14 +1016,14 @@ cifHierElementFunc(
(void) DBTreeSrTiles(&scx, &CIFCurStyle->cs_yankLayers, 0,
cifHierCopyFunc, (ClientData) CIFTotalDef);
CIFCopyMaskHints(&scx, CIFTotalDef);
DBTreeSrCells(&scx, 0, CIFCopyMaskHints,
DBTreeSrCells(&scx, 0, cifHierCopyMaskHints,
(ClientData)CIFTotalDef);
DBCellClearDef(CIFComponentDef);
(void) DBTreeSrTiles(&scx, &CIFCurStyle->cs_yankLayers, 0,
cifHierCopyFunc, (ClientData) CIFComponentDef);
CIFCopyMaskHints(&scx, CIFComponentDef);
DBTreeSrCells(&scx, 0, CIFCopyMaskHints,
DBTreeSrCells(&scx, 0, cifHierCopyMaskHints,
(ClientData)CIFComponentDef);
CIFErrorDef = (CellDef *) NULL;
@ -1007,10 +1055,9 @@ cifHierElementFunc(
*/
int
cifGrowSliver(
Tile *tile,
TileType dinfo, /* Split tile information, needs to be handled */
Rect *area)
cifGrowSliver(tile, area)
Tile *tile;
Rect *area;
{
int height, width, expand_up, expand_side;
@ -1069,25 +1116,23 @@ cifGrowSliver(
*/
int
cifHierPaintArrayFunc(
Tile *tile,
TileType dinfo,
ClientData clientdata) /* (unused) */
cifHierPaintArrayFunc(tile)
Tile *tile;
{
Rect area;
int i, j, xbot, xtop;
TiToRect(tile, &area);
if (CIFCurStyle->cs_flags & CWF_GROW_SLIVERS) cifGrowSliver(tile, dinfo, &area);
if (CIFCurStyle->cs_flags & CWF_GROW_SLIVERS) cifGrowSliver(tile, &area);
xbot = area.r_xbot;
xtop = area.r_xtop;
for (i=0; i<cifHierYCount; i++)
{
for (j = 0; j < cifHierXCount; j++)
for (j=0; j<cifHierXCount; j++)
{
DBNMPaintPlane(cifHierCurPlane, TiGetTypeExact(tile) | dinfo,
&area, CIFPaintTable, (PaintUndoInfo *) NULL);
CIFTileOps++;
DBPaintPlane(cifHierCurPlane, &area, CIFPaintTable,
(PaintUndoInfo *) NULL);
CIFTileOps += 1;
area.r_xbot += cifHierXSpacing;
area.r_xtop += cifHierXSpacing;
}
@ -1142,9 +1187,9 @@ cifHierPaintArrayFunc(
*/
int
cifHierArrayFunc(
SearchContext *scx, /* Information about the search. */
Plane **output) /* Array of planes to hold results. */
cifHierArrayFunc(scx, output)
SearchContext *scx; /* Information about the search. */
Plane **output; /* Array of planes to hold results. */
{
Rect childArea, parentArea, A, B, C, D, expandedArea;
CellUse *use;
@ -1488,10 +1533,10 @@ cifHierArrayFunc(
*/
void
CIFGenArrays(
CellDef *def, /* Parent cell for which CIF is computed. */
Rect *area, /* All CIF in this area is interesting. */
Plane **output) /* Array of pointers to planes into which
CIFGenArrays(def, area, output)
CellDef *def; /* Parent cell for which CIF is computed. */
Rect *area; /* All CIF in this area is interesting. */
Plane **output; /* Array of pointers to planes into which
* the CIF output will be OR'ed (real CIF
* only, temp layers won't appear). If
* output is NULL, then CIF is stored in

View File

@ -19,8 +19,8 @@
* rcsid "$Header: /usr/cvsroot/magic-8.0/cif/CIFint.h,v 1.3 2008/12/04 17:10:29 tim Exp $"
*/
#ifndef _MAGIC__CIF__CIFINT_H
#define _MAGIC__CIF__CIFINT_H
#ifndef _CIFINT_H
#define _CIFINT_H
#include "database/database.h"
@ -134,19 +134,15 @@ typedef struct cifop
* box coordinates into CIF layer geometry.
* CIFOP_NET - Added 11/3/08---pull an entire electrical net into
* the CIF layer, selectively picking layers.
* CIFOP_MAXRECT - Reduce all disjoint regions to the largest internal fitting
* CIFOP_MAXRECT - Reduce all areas to the largest internal fitting
* rectangle.
* CIFOP_INTERACT - Select all disjoint regions which overlap a given set of types
* CIFOP_COPYUP - Added 5/5/16---make and keep a copy the resulting layer,
* which will be painted into parent cells instead of the
* current cell. This replaces the "fault" method.
* CIFOP_CLOSE - Added 11/25/19---close up areas smaller than indicated
* CIFOP_MANHATTAN - Added 3/27/25---remove or fill nonmanhattan areas
* CIFOP_BRIDGE - Added 6/11/20---Bridge across catecorner gaps
* CIFOP_BRIDGELIM - Added 27/07/20---Bridge across catecorner gaps, but with limiting layers
* CIFOP_MASKHINTS - Added 12/14/20---Add geometry from cell properties, if any.
* CIFOP_NOTSQUARE - Added 2/26/26---Keep only geometry which is not square.
* CIFOP_TAGGED - Added 3/11/26---Find geometry attached to the given text label
*/
#define CIFOP_AND 1
@ -167,19 +163,12 @@ typedef struct cifop
#define CIFOP_BOUNDARY 16
#define CIFOP_NET 17
#define CIFOP_MAXRECT 18
#define CIFOP_INTERACT 19
#define CIFOP_COPYUP 20
#define CIFOP_CLOSE 21
#define CIFOP_MANHATTAN 22
#define CIFOP_BRIDGE 23
#define CIFOP_BRIDGELIM 24
#define CIFOP_MASKHINTS 25
#define CIFOP_NOTSQUARE 26
#define CIFOP_TAGGED 27
#define CIFOP_COPYUP 19
#define CIFOP_CLOSE 20
#define CIFOP_BRIDGE 21
#define CIFOP_BRIDGELIM 22
#define CIFOP_MASKHINTS 23
/* Definitions of bit fields used in the value of co_client for CIFOP_INTERACT */
#define CIFOP_INT_NOT 0x1 /* Inverted sense (not interacting) */
#define CIFOP_INT_TOUCHING 0x2 /* Include both touching and overlapping */
/* Added by Tim 10/21/2004 */
/* The following structure is used to pass information on how to draw
@ -330,33 +319,37 @@ typedef struct cifstyle
/* procedures */
extern bool CIFNameToMask(char *name, TileTypeBitMask *result, TileTypeBitMask *depend);
extern void CIFGenSubcells(CellDef *def, Rect *area, Plane **output);
extern void CIFGenArrays(CellDef *def, Rect *area, Plane **output);
extern void CIFGen(CellDef *cellDef, CellDef *origDef, const Rect *area, Plane **planes, TileTypeBitMask *layers,
bool replace, bool genAllPlanes, bool hier, ClientData clientdata);
extern void CIFClearPlanes(Plane **planes);
extern Plane *CIFGenLayer(CIFOp *op, const Rect *area, CellDef *cellDef, CellDef *origDef, Plane *temps[],
bool hier, ClientData clientdata);
extern void CIFInitCells(void);
extern int cifHierCopyFunc(Tile *tile, TileType dinfo, TreeContext *cxp);
extern void CIFLoadStyle(char *stylename);
extern int CIFCopyMaskHints(SearchContext *scx, CellDef *targetDef);
extern bool CIFNameToMask();
extern void CIFGenSubcells();
extern void CIFGenArrays();
extern void CIFGen();
extern void CIFClearPlanes();
extern Plane *CIFGenLayer();
extern void CIFInitCells();
extern int cifHierCopyFunc();
extern int cifHierCopyMaskHints();
extern void CIFLoadStyle();
extern void CIFCopyMaskHints();
/* C99 compat */
extern void CIFCoverageLayer(CellDef *rootDef, Rect *area, char *layer, bool dolist);
extern bool CIFWriteFlat(CellDef *rootDef, FILE *f);
extern void CIFScalePlanes(int scalen, int scaled, Plane **planearray);
extern void CIFInputRescale(int n, int d);
extern int CIFScaleCoord(int cifCoord, int snap_type);
extern int cifGrowSliver(Tile *tile, TileType dinfo, Rect *area);
extern int cifHierElementFunc(CellUse *use, Transform *transform, int x, int y, Rect *checkArea);
extern int cifSquareFunc(Rect *area, CIFOp *op, int *rows, int *columns, Rect *cut);
extern int cifSquareGridFunc(Rect *area, CIFOp *op, int *rows, int *columns, Rect *cut);
extern int cifSlotFunc(Rect *area, CIFOp *op, int *numY, int *numX, Rect *cut, bool vertical);
extern int CIFParseScale(char *true_scale, int *expander);
extern int cifParseCalmaNums(char *str, int *numArray, int numNums);
extern bool CIFReadTechLimitScale(int ns, int ds);
extern void CIFCoverageLayer();
extern bool CIFWriteFlat();
extern void CIFScalePlanes();
extern void CIFInputRescale();
extern int CIFCalmaLayerToCifLayer();
extern int CIFScaleCoord();
extern void CIFPropRecordPath();
extern void CIFPaintWirePath();
extern void CIFMakeManhattanPath();
extern int cifGrowSliver();
extern int cifHierElementFunc();
extern int cifSquareFunc();
extern int cifSquareGridFunc();
extern int cifSlotFunc();
extern int CIFParseScale();
extern int cifParseCalmaNums();
extern int CIFEdgeDirection();
extern bool CIFReadTechLimitScale();
/* Shared variables and structures: */
@ -370,9 +363,6 @@ extern CellUse *CIFDummyUse; /* Used to dummy up a CellUse for a
* def.
*/
extern Plane *CIFTotalPlanes[]; /* Exported for diagnostics */
extern Plane *CIFComponentPlanes[]; /* Exported for diagnostics */
/* Valid values of CIFWarningLevel (see cif.h) */
typedef enum {CIF_WARN_DEFAULT, CIF_WARN_NONE, CIF_WARN_ALIGN,
@ -387,13 +377,13 @@ extern int CIFHierRects;
/* Tables used for painting and erasing CIF. */
extern const PaintResultType CIFPaintTable[], CIFEraseTable[];
extern PaintResultType CIFPaintTable[], CIFEraseTable[];
/* Procedures and variables for reporting errors. */
extern int CIFErrorLayer;
extern CellDef *CIFErrorDef;
extern void CIFError(Rect *area, char *message);
extern void CIFError();
/* The following determines the tile type used to hold the CIF
* information on its paint plane.
@ -402,4 +392,4 @@ extern void CIFError(Rect *area, char *message);
#define CIF_SOLIDTYPE 1
extern TileTypeBitMask CIFSolidBits;
#endif /* _MAGIC__CIF__CIFINT_H */
#endif /* _CIFINT_H */

View File

@ -17,7 +17,7 @@
*/
#ifndef lint
static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cif/CIFmain.c,v 1.3 2009/01/15 15:44:34 tim Exp $";
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cif/CIFmain.c,v 1.3 2009/01/15 15:44:34 tim Exp $";
#endif /* not lint */
#include <stdio.h>
@ -95,7 +95,7 @@ global int CIFErrorLayer; /* Index of CIF layer associated with errors.*/
*/
void
CIFPrintStats(void)
CIFPrintStats()
{
TxPrintf("CIF statistics (recent/total):\n");
cifTotalTileOps += CIFTileOps;
@ -136,8 +136,8 @@ CIFPrintStats(void)
*/
float
CIFGetOutputScale(
int convert)
CIFGetOutputScale(convert)
int convert;
{
if (CIFCurStyle == NULL) return 1.0;
@ -159,8 +159,8 @@ CIFGetOutputScale(
*/
float
CIFGetScale(
int convert)
CIFGetScale(convert)
int convert;
{
if (CIFCurStyle == NULL) return 1.0;
@ -185,10 +185,10 @@ CIFGetScale(
*/
void
CIFPrintStyle(
bool dolist, /* Return as a list if true */
bool doforall, /* Print all known styles if true */
bool docurrent) /* Print current style if true */
CIFPrintStyle(dolist, doforall, docurrent)
bool dolist; /* Return as a list if true */
bool doforall; /* Print all known styles if true */
bool docurrent; /* Print current style if true */
{
CIFKeep *style;
@ -254,8 +254,8 @@ CIFPrintStyle(
*/
void
CIFSetStyle(
char *name) /* Name of the new style. If NULL, just
CIFSetStyle(name)
char *name; /* Name of the new style. If NULL, just
* print out the valid styles.
*/
{
@ -320,10 +320,10 @@ CIFSetStyle(
*/
bool
CIFNameToMask(
char *name,
TileTypeBitMask *result,
TileTypeBitMask *depend)
CIFNameToMask(name, result, depend)
char *name;
TileTypeBitMask *result;
TileTypeBitMask *depend;
{
int i, j;
CIFOp *op;
@ -414,11 +414,11 @@ CIFNameToMask(
*/
void
CIFError(
Rect *area, /* Place in CIFErrorDef where there was a
CIFError(area, message)
Rect *area; /* Place in CIFErrorDef where there was a
* problem in generating CIFErrorLayer.
*/
char *message) /* Short note about what went wrong. */
char *message; /* Short note about what went wrong. */
{
char msg[200];
@ -452,7 +452,7 @@ CIFError(
*/
int
CIFOutputScaleFactor(void)
CIFOutputScaleFactor()
{
if (CIFCurStyle == NULL) return 1;
return CIFCurStyle->cs_scaleFactor;

View File

@ -19,7 +19,7 @@
*/
#ifndef lint
static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cif/CIFrdcl.c,v 1.5 2010/08/25 17:33:55 tim Exp $";
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cif/CIFrdcl.c,v 1.5 2010/08/25 17:33:55 tim Exp $";
#endif /* not lint */
#include <stdio.h>
@ -126,8 +126,8 @@ char *cifSubcellId = NULL;
*/
void
CIFReadCellInit(
int ptrkeys)
CIFReadCellInit(ptrkeys)
int ptrkeys;
{
int i;
@ -162,8 +162,8 @@ CIFReadCellInit(
*/
bool
cifForgetCell(
int cifNum)
cifForgetCell(cifNum)
int cifNum;
{
HashEntry *h;
@ -196,8 +196,8 @@ cifForgetCell(
*/
void
cifUniqueCell(
int cifNum)
cifUniqueCell(cifNum)
int cifNum;
{
HashEntry *h;
CellDef *def, *testdef;
@ -256,8 +256,8 @@ cifUniqueCell(
*/
CellDef *
cifFindCell(
int cifNum) /* The CIF number of the desired cell. */
cifFindCell(cifNum)
int cifNum; /* The CIF number of the desired cell. */
{
HashEntry *h;
CellDef *def, *testdef;
@ -299,10 +299,10 @@ cifFindCell(
*/
void
CIFScalePlanes(
int scalen,
int scaled,
Plane **planearray)
CIFScalePlanes(scalen, scaled, planearray)
int scalen;
int scaled;
Plane **planearray;
{
int pNum;
Plane *newplane;
@ -348,9 +348,8 @@ CIFScalePlanes(
*/
void
CIFInputRescale(
int n,
int d)
CIFInputRescale(n, d)
int n, d;
{
CIFReadStyle *istyle = cifCurReadStyle;
CIFReadLayer *cl;
@ -390,7 +389,7 @@ CIFInputRescale(
CIFScalePlanes(n, d, cifCurReadPlanes);
if (cifCurReadPlanes != cifEditCellPlanes)
CIFScalePlanes(n, d, cifEditCellPlanes);
if ((const Plane*)cifEditCellPlanes != (const Plane*)cifSubcellPlanes && cifCurReadPlanes != cifSubcellPlanes)
if (cifEditCellPlanes != cifSubcellPlanes && cifCurReadPlanes != cifSubcellPlanes)
CIFScalePlanes(n, d, cifSubcellPlanes);
CIFReadWarning("CIF style %s: units rescaled by factor of %d / %d\n",
@ -418,7 +417,7 @@ CIFInputRescale(
*/
bool
CIFParseStart(void)
CIFParseStart()
{
int number;
@ -503,10 +502,9 @@ CIFParseStart(void)
* ----------------------------------------------------------------------------
*/
int cifCheckPaintFunc(
Tile *tile,
TileType dinfo,
ClientData clientData)
int cifCheckPaintFunc(tile, clientData)
Tile *tile;
ClientData clientData;
{
return 1;
}
@ -514,30 +512,29 @@ int cifCheckPaintFunc(
/* Callback function for copying paint from one CIF cell into another */
int
cifCopyPaintFunc(
Tile *tile,
TileType dinfo,
CIFCopyRec *cifCopyRec)
cifCopyPaintFunc(tile, cifCopyRec)
Tile *tile;
CIFCopyRec *cifCopyRec;
{
int pNum;
TileType newdinfo;
TileType dinfo;
Rect sourceRect, targetRect;
Transform *trans = cifCopyRec->trans;
Plane *plane = cifCopyRec->plane;
newdinfo = TiGetTypeExact(tile) | dinfo;
dinfo = TiGetTypeExact(tile);
if (trans)
{
TiToRect(tile, &sourceRect);
GeoTransRect(trans, &sourceRect, &targetRect);
if (IsSplit(tile))
newdinfo = DBTransformDiagonal(TiGetTypeExact(tile) | dinfo, trans);
dinfo = DBTransformDiagonal(TiGetTypeExact(tile), trans);
}
else
TiToRect(tile, &targetRect);
DBNMPaintPlane(plane, newdinfo, &targetRect, CIFPaintTable,
DBNMPaintPlane(plane, dinfo, &targetRect, CIFPaintTable,
(PaintUndoInfo *)NULL);
return 0;
@ -561,10 +558,9 @@ cifCopyPaintFunc(
*/
int
cifMaskHintFunc(
Tile *tile,
TileType dinfo, /* Unused, do not support non-manhattan hints */
LinkedRect **lrecp)
cifMaskHintFunc(tile, lrecp)
Tile *tile;
LinkedRect **lrecp;
{
Rect r;
LinkedRect *newlr;
@ -597,12 +593,11 @@ cifMaskHintFunc(
*/
int
CIFPaintCurrent(
int filetype)
CIFPaintCurrent(filetype)
bool filetype;
{
/* Forward declarations. */
extern int cifMakeBoundaryFunc(Tile *tile, TileType dinfo, ClientData clientdata);
extern int cifPaintCurrentFunc(Tile *tile, TileType dinfo, TileType type);
extern int cifMakeBoundaryFunc(); /* Forward declaration. */
extern int cifPaintCurrentFunc(); /* Forward declaration. */
Plane *plane, *swapplane;
int i;
@ -613,7 +608,7 @@ CIFPaintCurrent(
CIFOp *op;
plane = CIFGenLayer(cifCurReadStyle->crs_layers[i]->crl_ops,
&TiPlaneRect, cifReadCellDef, cifReadCellDef,
&TiPlaneRect, (CellDef *)NULL, (CellDef *)NULL,
cifCurReadPlanes, FALSE, (ClientData)NULL);
/* Generate a paint/erase table, then paint from the CIF
@ -688,8 +683,6 @@ CIFPaintCurrent(
}
else if (op == NULL)
{
LinkedRect *lrec = NULL, *lsrch;
/* Handle boundary layer */
op = cifCurReadStyle->crs_layers[i]->crl_ops;
@ -703,103 +696,7 @@ CIFPaintCurrent(
&DBAllButSpaceBits, cifCheckPaintFunc,
(ClientData)NULL) == 1))
DBSrPaintArea((Tile *) NULL, plane, &TiPlaneRect,
&CIFSolidBits, cifMakeBoundaryFunc, INT2CD(filetype));
/* Handle mask-hints input operator */
op = cifCurReadStyle->crs_layers[i]->crl_ops;
while (op)
{
if (op->co_opcode == CIFOP_MASKHINTS) break;
op = op->co_next;
}
if (op && (DBSrPaintArea((Tile *)NULL, plane, &TiPlaneRect,
&DBAllButSpaceBits, cifCheckPaintFunc,
(ClientData)NULL) == 1))
{
/* (To do: remove the linked Rects and paint directly
* into the plane in cifMaskHintFunc())
*/
DBSrPaintArea((Tile *) NULL, plane, &TiPlaneRect,
&CIFSolidBits, cifMaskHintFunc,
(ClientData)&lrec);
if (lrec != NULL)
{
PropertyRecord *proprec, *proporig;
char *propname, *layername;
int proplen, i, savescale;
bool origfound = FALSE;
Plane *plane;
layername = (char *)op->co_client;
propname = (char *)mallocMagic(11 + strlen(layername));
sprintf(propname, "MASKHINTS_%s", layername);
/* If there is already a mask hint plane for this layer,
* then add to it; otherwise, create a new plane.
*/
proprec = DBPropGet(cifReadCellDef, layername, &origfound);
if (origfound)
plane = proprec->prop_value.prop_plane;
else
{
proprec = (PropertyRecord *)mallocMagic(
sizeof(PropertyRecord));
proprec->prop_type = PROPERTY_TYPE_PLANE;
proprec->prop_len = 0; /* (unused) */
plane = DBNewPlane((ClientData)TT_SPACE);
proprec->prop_value.prop_plane = plane;
DBPropPut(cifReadCellDef, propname, proprec);
}
while (lrec != NULL)
{
lrec->r_r.r_xtop =
CIFScaleCoord(lrec->r_r.r_xtop, COORD_EXACT);
savescale = cifCurReadStyle->crs_scaleFactor;
lrec->r_r.r_ytop =
CIFScaleCoord(lrec->r_r.r_ytop, COORD_EXACT);
if (savescale != cifCurReadStyle->crs_scaleFactor)
{
lrec->r_r.r_xtop *=
(savescale / cifCurReadStyle->crs_scaleFactor);
savescale = cifCurReadStyle->crs_scaleFactor;
}
lrec->r_r.r_xbot =
CIFScaleCoord(lrec->r_r.r_xbot, COORD_EXACT);
if (savescale != cifCurReadStyle->crs_scaleFactor)
{
lrec->r_r.r_xtop *=
(savescale / cifCurReadStyle->crs_scaleFactor);
lrec->r_r.r_ytop *=
(savescale / cifCurReadStyle->crs_scaleFactor);
savescale = cifCurReadStyle->crs_scaleFactor;
}
lrec->r_r.r_ybot =
CIFScaleCoord(lrec->r_r.r_ybot, COORD_EXACT);
if (savescale != cifCurReadStyle->crs_scaleFactor)
{
lrec->r_r.r_xtop *=
(savescale / cifCurReadStyle->crs_scaleFactor);
lrec->r_r.r_ytop *=
(savescale / cifCurReadStyle->crs_scaleFactor);
lrec->r_r.r_xbot *=
(savescale / cifCurReadStyle->crs_scaleFactor);
}
DBPaintPlane(plane, &lrec->r_r, CIFPaintTable,
(PaintUndoInfo *)NULL);
free_magic1_t mm1 = freeMagic1_init();
freeMagic1(&mm1, lrec);
lrec = lrec->r_next;
freeMagic1_end(&mm1);
}
freeMagic(propname);
}
}
&CIFSolidBits, cifMakeBoundaryFunc, (ClientData)filetype);
}
/* Swap planes */
@ -811,7 +708,7 @@ CIFPaintCurrent(
{
DBSrPaintArea((Tile *) NULL, plane, &TiPlaneRect,
&CIFSolidBits, cifPaintCurrentFunc,
INT2CD(type));
(ClientData)type);
}
/* Recycle the plane, which was dynamically allocated. */
@ -888,7 +785,9 @@ CIFPaintCurrent(
for (i = 0; i < cifNReadLayers; i++)
{
LinkedRect *lrec = NULL, *lsrch;
LinkedRect *lrec = NULL;
char *propstr = NULL;
char locstr[512];
Plane *tempp;
if (!TTMaskHasType(CalmaMaskHints, i)) continue;
@ -913,55 +812,51 @@ CIFPaintCurrent(
(CellDef *)NULL, CIFPlanes, FALSE, (ClientData)NULL);
/* Scan the resulting plane and generate linked Rect structures for
* each shape found. (To do: Remove the linked Rects and paint
* directly into the plane in cifMaskHintFunc(), which is more
* efficient but not hugely so.)
* each shape found.
*/
DBSrPaintArea((Tile *)NULL, presult, &TiPlaneRect, &CIFSolidBits,
cifMaskHintFunc, (ClientData)&lrec);
if (lrec != NULL)
{
PropertyRecord *proprec;
bool propfound;
char *propname;
Plane *plane;
propname = (char *)mallocMagic(11 + strlen(cifReadLayers[i]));
sprintf(propname, "MASKHINTS_%s", cifReadLayers[i]);
/* Paint all linked Rects into a mask-hints property plane
* in the target cell.
propstr = (char *)NULL;
/* Turn all linked Rects into a mask-hints property in the
* target cell.
*/
proprec = DBPropGet(cifReadCellDef, propname, &propfound);
if (!propfound)
{
proprec = (PropertyRecord *)mallocMagic(sizeof(PropertyRecord));
proprec->prop_type = PROPERTY_TYPE_PLANE;
proprec->prop_len = 0; /* (unused) */
plane = DBNewPlane((ClientData)TT_SPACE);
proprec->prop_value.prop_plane = plane;
DBPropPut(cifReadCellDef, propname, proprec);
}
else
plane = proprec->prop_value.prop_plane;
while (lrec != NULL)
{
lrec->r_r.r_xbot /= CIFCurStyle->cs_scaleFactor;
lrec->r_r.r_ybot /= CIFCurStyle->cs_scaleFactor;
lrec->r_r.r_xtop /= CIFCurStyle->cs_scaleFactor;
lrec->r_r.r_ytop /= CIFCurStyle->cs_scaleFactor;
DBPaintPlane(plane, &lrec->r_r, CIFPaintTable,
(PaintUndoInfo *)NULL);
free_magic1_t mm1 = freeMagic1_init();
freeMagic1(&mm1, lrec);
char *newstr;
sprintf(locstr, "%d %d %d %d",
lrec->r_r.r_xbot / CIFCurStyle->cs_scaleFactor,
lrec->r_r.r_ybot / CIFCurStyle->cs_scaleFactor,
lrec->r_r.r_xtop / CIFCurStyle->cs_scaleFactor,
lrec->r_r.r_ytop / CIFCurStyle->cs_scaleFactor);
if (propstr == NULL)
{
newstr = (char *)mallocMagic(strlen(locstr) + 1);
sprintf(newstr, "%s", locstr);
}
else
{
newstr = (char *)mallocMagic(strlen(locstr)
+ strlen(propstr) + 2);
sprintf(newstr, "%s %s", propstr, locstr);
freeMagic(propstr);
}
propstr = newstr;
freeMagic(lrec);
lrec = lrec->r_next;
freeMagic1_end(&mm1);
}
}
/* NOTE: propstr is transferred to the CellDef and should
* not be free'd here.
*/
DBPropPut(cifReadCellDef, propname, propstr);
freeMagic(propname);
}
@ -991,20 +886,18 @@ CIFPaintCurrent(
/* Use CIF layer geometry to define a fixed bounding box for the current cell */
int
cifMakeBoundaryFunc(
Tile *tile, /* Tile of CIF information. */
TileType dinfo, /* Split tile information (unused) */
ClientData clientdata) /* Pass the file type (CIF or CALMA) */
cifMakeBoundaryFunc(tile, clientdata)
Tile *tile; /* Tile of CIF information. */
ClientData clientdata; /* Pass the file type (CIF or CALMA) */
{
/* It is assumed that there is one rectangle for the boundary. */
/* If there are multiple rectangles defined with the boundary */
/* layer, then the last one defines the FIXED_BBOX property. */
PropertyRecord *proprec;
Rect area;
char propertyvalue[128], *storedvalue;
int savescale;
int filetype = (int)CD2INT(clientdata);
bool filetype = (bool)clientdata;
TiToRect(tile, &area);
area.r_xtop = CIFScaleCoord(area.r_xtop, COORD_EXACT);
@ -1032,24 +925,19 @@ cifMakeBoundaryFunc(
if (cifReadCellDef->cd_flags & CDFIXEDBBOX)
{
PropertyRecord *proprec;
char *propvalue;
bool found;
/* Only flag a warning if the redefined boundary was */
/* different from the original. */
proprec = DBPropGet(cifReadCellDef, "FIXED_BBOX", &found);
propvalue = (char *)DBPropGet(cifReadCellDef, "FIXED_BBOX", &found);
if (found)
{
Rect bbox;
if ((proprec->prop_type == PROPERTY_TYPE_DIMENSION) &&
(proprec->prop_len == 4))
if (sscanf(propvalue, "%d %d %d %d", &bbox.r_xbot, &bbox.r_ybot,
&bbox.r_xtop, &bbox.r_ytop) == 4)
{
bbox.r_xbot = proprec->prop_value.prop_integer[0];
bbox.r_ybot = proprec->prop_value.prop_integer[1];
bbox.r_xtop = proprec->prop_value.prop_integer[2];
bbox.r_ytop = proprec->prop_value.prop_integer[3];
if ((bbox.r_xbot != area.r_xbot) ||
(bbox.r_ybot != area.r_ybot) ||
(bbox.r_xtop != area.r_xtop) ||
@ -1066,15 +954,10 @@ cifMakeBoundaryFunc(
}
}
proprec = (PropertyRecord *)mallocMagic(sizeof(PropertyRecord) + 2 * sizeof(int));
proprec->prop_type = PROPERTY_TYPE_DIMENSION;
proprec->prop_len = 4;
proprec->prop_value.prop_integer[0] = area.r_xbot;
proprec->prop_value.prop_integer[1] = area.r_ybot;
proprec->prop_value.prop_integer[2] = area.r_xtop;
proprec->prop_value.prop_integer[3] = area.r_ytop;
DBPropPut(cifReadCellDef, "FIXED_BBOX", proprec);
sprintf(propertyvalue, "%d %d %d %d",
area.r_xbot, area.r_ybot, area.r_xtop, area.r_ytop);
storedvalue = StrDup((char **)NULL, propertyvalue);
DBPropPut(cifReadCellDef, "FIXED_BBOX", storedvalue);
cifReadCellDef->cd_flags |= CDFIXEDBBOX;
return 0;
}
@ -1082,10 +965,9 @@ cifMakeBoundaryFunc(
/* Paint CIF layer geometry into the current cell def as magic layer "type" */
int
cifPaintCurrentFunc(
Tile *tile, /* Tile of CIF information. */
TileType dinfo, /* Split tile information */
TileType type) /* Magic type to be painted. */
cifPaintCurrentFunc(tile, type)
Tile *tile; /* Tile of CIF information. */
TileType type; /* Magic type to be painted. */
{
Rect area;
int pNum;
@ -1134,7 +1016,7 @@ cifPaintCurrentFunc(
for (pNum = PL_PAINTBASE; pNum < DBNumPlanes; pNum++)
if (DBPaintOnPlane(type, pNum))
{
DBNMPaintPlane(cifReadCellDef->cd_planes[pNum], TiGetTypeExact(tile) | dinfo,
DBNMPaintPlane(cifReadCellDef->cd_planes[pNum], TiGetTypeExact(tile),
&area, DBStdPaintTbl(type, pNum), (PaintUndoInfo *) NULL);
}
@ -1160,7 +1042,7 @@ cifPaintCurrentFunc(
*/
bool
CIFParseFinish(void)
CIFParseFinish()
{
if (!cifSubcellBeingRead)
{
@ -1215,7 +1097,7 @@ CIFParseFinish(void)
*/
bool
CIFParseDelete(void)
CIFParseDelete()
{
int number;
@ -1257,7 +1139,7 @@ CIFParseDelete(void)
*/
char *
cifParseName(void)
cifParseName()
{
char ch;
char *bufferp;
@ -1299,7 +1181,7 @@ cifParseName(void)
*/
bool
cifParseUser9(void)
cifParseUser9()
{
char *name;
@ -1331,7 +1213,7 @@ cifParseUser9(void)
*/
bool
CIFParseCall(void)
CIFParseCall()
{
int called;
Transform transform;
@ -1398,7 +1280,7 @@ CIFParseCall(void)
*/
bool
cifParseUser91(void)
cifParseUser91()
{
if (cifSubcellId != NULL)
{
@ -1429,7 +1311,7 @@ cifParseUser91(void)
*/
bool
cifParseUser94(void)
cifParseUser94()
{
Rect rectangle;
char *name = NULL;
@ -1519,7 +1401,7 @@ cifParseUser94(void)
*/
bool
cifParseUser95(void)
cifParseUser95()
{
/* Modified by BIM 1/8/2018 */
Rect rectangle;
@ -1679,7 +1561,7 @@ cifParseUser95(void)
* ----------------------------------------------------------------------------
*/
bool
CIFParseUser(void)
CIFParseUser()
{
char ch;
@ -1731,8 +1613,8 @@ CIFParseUser(void)
*/
void
CIFReadCellCleanup(
int filetype)
CIFReadCellCleanup(filetype)
bool filetype;
{
HashEntry *h;
HashSearch hs;
@ -1775,7 +1657,7 @@ CIFReadCellCleanup(
def->cd_flags &= ~CDPROCESSEDGDS;
if ((filetype == FILE_CIF && CIFNoDRCCheck == FALSE) ||
(filetype == FILE_CALMA && CalmaNoDRCCheck == FALSE))
(filetype == 1 && CalmaNoDRCCheck == FALSE))
DRCCheckThis(def, TT_CHECKPAINT, &def->cd_bbox);
DBWAreaChanged(def, &def->cd_bbox, DBW_ALLWINDOWS, &DBAllButSpaceBits);
DBCellSetModified(def, TRUE);
@ -1786,8 +1668,8 @@ CIFReadCellCleanup(
}
/* Do geometrical processing on the top-level cell. */
if (filetype == FILE_CIF) CIFPaintCurrent(filetype);
CIFPaintCurrent(FILE_CIF);
DBAdjustLabels(EditCellUse->cu_def, &TiPlaneRect);
DBReComputeBbox(EditCellUse->cu_def);
DBWAreaChanged(EditCellUse->cu_def, &EditCellUse->cu_def->cd_bbox,

View File

@ -17,7 +17,7 @@
*/
#ifndef lint
static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cif/CIFrdpoly.c,v 1.3 2010/06/24 12:37:15 tim Exp $";
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cif/CIFrdpoly.c,v 1.3 2010/06/24 12:37:15 tim Exp $";
#endif /* not lint */
#include <stdio.h>
@ -55,14 +55,10 @@ static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magi
*/
int
cifLowX(
const void *aa,
const void *bb)
cifLowX(a, b)
CIFPath **a, **b;
{
const CIFPath **a = (const CIFPath **)aa;
const CIFPath **b = (const CIFPath **)bb;
const Point *p, *q;
Point *p, *q;
p = &(*a)->cifp_point;
q = &(*b)->cifp_point;
@ -92,12 +88,9 @@ cifLowX(
*/
int
cifLowY(
const void *aa,
const void *bb)
cifLowY(a, b)
Point **a, **b;
{
const Point **a = (const Point **)aa;
const Point **b = (const Point **)bb;
if ((*a)->p_y < (*b)->p_y)
return (-1);
if ((*a)->p_y > (*b)->p_y)
@ -126,10 +119,10 @@ cifLowY(
*/
bool
cifOrient(
CIFPath *edges[], /* Array of edges to be categorized. */
int nedges, /* Size of arrays. */
int dir[]) /* Array to hold directions. */
cifOrient(edges, nedges, dir)
CIFPath *edges[]; /* Array of edges to be categorized. */
int dir[]; /* Array to hold directions. */
int nedges; /* Size of arrays. */
{
Point *p, *q;
int n;
@ -186,11 +179,10 @@ cifOrient(
*/
bool
cifCross(
CIFPath *edge, /* Pointer to first of 2 path points in edge */
int dir, /* Direction of edge */
int ybot,
int ytop) /* Range of interest */
cifCross(edge, dir, ybot, ytop)
CIFPath *edge; /* Pointer to first of 2 path points in edge */
int dir; /* Direction of edge */
int ybot, ytop; /* Range of interest */
{
int ebot, etop;
@ -231,12 +223,12 @@ cifCross(
*/
LinkedRect *
CIFPolyToRects(
CIFPath *path, /* Path describing a polygon. */
Plane *plane, /* Plane to draw on */
const PaintResultType *resultTbl,
PaintUndoInfo *ui,
bool isCalma) /* TRUE for Calma, FALSE for CIF */
CIFPolyToRects(path, plane, resultTbl, ui, isCalma)
CIFPath *path; /* Path describing a polygon. */
Plane *plane; /* Plane to draw on */
PaintResultType *resultTbl;
PaintUndoInfo *ui;
bool isCalma; /* TRUE for Calma, FALSE for CIF */
{
int npts = 0, n, *dir, curr, wrapno;
int xbot, xtop, ybot, ytop;

View File

@ -18,7 +18,7 @@
*/
#ifndef lint
static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cif/CIFrdpt.c,v 1.2 2010/06/24 12:37:15 tim Exp $";
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cif/CIFrdpt.c,v 1.2 2010/06/24 12:37:15 tim Exp $";
#endif /* not lint */
#include <stdio.h>
@ -65,7 +65,7 @@ static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magi
*/
bool
CIFParseBox(void)
CIFParseBox()
{
Point center;
Point direction;
@ -176,7 +176,7 @@ CIFParseBox(void)
*/
bool
CIFParseFlash(void)
CIFParseFlash()
{
int diameter;
int savescale;
@ -236,69 +236,48 @@ CIFParseFlash(void)
*/
void
CIFPropRecordPath(
CellDef *def,
CIFPath *pathheadp,
bool iswire,
char *propname)
CIFPropRecordPath(def, pathheadp, iswire, propname)
CellDef *def;
CIFPath *pathheadp;
bool iswire;
char *propname;
{
extern float CIFGetOutputScale(int convert);
extern float CIFGetOutputScale();
CIFPath *pathp;
char *namestr = NULL;
int components, i, x, y, mult, pathnum;
PropertyRecord *proprec;
bool propfound;
char *pathstr, *sptr;
int components;
float x, y, oscale, mult;
/* If "name" is a property, then append a suffix to it to ensure uniqueness */
DBPropGet(def, propname, &propfound);
if (propfound)
{
pathnum = 0;
namestr = mallocMagic(strlen(propname) + 10);
while (propfound)
{
sprintf(namestr, "%s_%d", propname, pathnum);
DBPropGet(def, namestr, &propfound);
pathnum++;
}
}
oscale = CIFGetOutputScale(1000); /* 1000 for conversion to um */
if (oscale == 0.0) oscale = 1.0;
mult = (iswire == TRUE) ? 0.5 : 1.0;
mult = (iswire == TRUE) ? 1 : 0;
/* Count the number of components in the path */
pathp = pathheadp;
components = 0;
/* Count the number of components in the path */
while (pathp != NULL)
{
components++;
pathp = pathp->cifp_next;
components++;
}
/* Allocate enough space to hold 2 * N points. */
proprec = (PropertyRecord *)mallocMagic(sizeof(PropertyRecord) +
((components - 1) * 2) * sizeof(int));
proprec->prop_type = PROPERTY_TYPE_DIMENSION;
proprec->prop_len = components * 2;
/* Allocate enough space to hold 2 * N points at "infinity" */
pathstr = (char *)mallocMagic(components * 40);
pathp = pathheadp;
i = 0;
sptr = pathstr;
while (pathp != NULL)
{
x = pathp->cifp_x >> mult;
y = pathp->cifp_y >> mult;
proprec->prop_value.prop_integer[i] = x;
proprec->prop_value.prop_integer[i + 1] = y;
i += 2;
x = (float)pathp->cifp_x * oscale * mult;
y = (float)pathp->cifp_y * oscale * mult;
sprintf(sptr, "%.3f %.3f ", x, y);
sptr = sptr + strlen(sptr);
pathp = pathp->cifp_next;
}
if (namestr)
{
DBPropPut(def, namestr, proprec);
freeMagic(namestr);
}
else
DBPropPut(def, propname, proprec);
/* Reallocate pathstr to be no larger than needed to hold the path contents */
StrDup(&pathstr, pathstr);
DBPropPut(def, propname, (ClientData)pathstr);
}
/*
@ -337,13 +316,13 @@ CIFPropRecordPath(
*/
void
CIFPaintWirePath(
CIFPath *pathheadp,
int width,
bool endcap,
Plane *plane,
const PaintResultType *ptable,
PaintUndoInfo *ui)
CIFPaintWirePath(pathheadp, width, endcap, plane, ptable, ui)
CIFPath *pathheadp;
int width;
bool endcap;
Plane *plane;
PaintResultType *ptable;
PaintUndoInfo *ui;
{
CIFPath *pathp, *previousp, *nextp, *polypath;
CIFPath *returnpath, *newpath, *savepath;
@ -359,20 +338,18 @@ CIFPaintWirePath(
pathp = pathheadp->cifp_next;
if (pathp != NULL)
{
free_magic1_t mm1 = freeMagic1_init();
while (pathp->cifp_next != NULL)
{
if (pathp->cifp_next->cifp_x == pathp->cifp_x &&
pathp->cifp_next->cifp_y == pathp->cifp_y)
{
previousp->cifp_next = pathp->cifp_next;
freeMagic1(&mm1, pathp);
freeMagic(pathp);
}
else
previousp = pathp;
pathp = pathp->cifp_next;
}
freeMagic1_end(&mm1);
}
previousp = pathheadp;
@ -462,8 +439,7 @@ CIFPaintWirePath(
/* Wire reverses direction. Break wire here, */
/* draw, and start new polygon. */
TxError("Warning: direction reversal in path at (%d, %d).\n",
pathp->cifp_x, pathp->cifp_y);
TxError("Warning: direction reversal in path.\n");
phi = theta;
if (endcap)
@ -475,8 +451,7 @@ CIFPaintWirePath(
firstpoint = TRUE;
}
else {
TxError("Error: mitre limit exceeded at wire junction at (%d, %d).\n",
pathp->cifp_x, pathp->cifp_y);
TxError("Error: mitre limit exceeded at wire junction.\n");
TxError("Route has been truncated.\n");
break;
}
@ -509,13 +484,11 @@ CIFPaintWirePath(
rectp = CIFPolyToRects(polypath, plane, ptable, ui, FALSE);
CIFFreePath(polypath);
free_magic1_t mm1 = freeMagic1_init();
for (; rectp != NULL ; rectp = rectp->r_next)
{
DBPaintPlane(plane, &rectp->r_r, ptable, ui);
freeMagic1(&mm1, (char *) rectp);
freeMagic((char *) rectp);
}
freeMagic1_end(&mm1);
polypath = NULL;
}
else
@ -589,13 +562,13 @@ CIFPaintWirePath(
*/
LinkedRect *
PaintPolygon(
Point *pointlist, /* Array of Point structures */
int number, /* total number of points */
Plane *plane, /* Plane structure to paint into */
PaintResultType *ptable, /* Paint result table */
PaintUndoInfo *ui, /* Undo record */
bool keep) /* Return list of rects if true */
PaintPolygon(pointlist, number, plane, ptable, ui, keep)
Point *pointlist; /* Array of Point structures */
int number; /* total number of points */
Plane *plane; /* Plane structure to paint into */
PaintResultType *ptable; /* Paint result table */
PaintUndoInfo *ui; /* Undo record */
bool keep; /* Return list of rects if true */
{
LinkedRect *rectp, *rectlist;
CIFPath *newpath, *cifpath = (CIFPath *)NULL;
@ -613,13 +586,11 @@ PaintPolygon(
rectlist = CIFPolyToRects(cifpath, plane, ptable, ui, FALSE);
CIFFreePath(cifpath);
free_magic1_t mm1 = freeMagic1_init();
for (rectp = rectlist; rectp != NULL ; rectp = rectp->r_next)
{
DBPaintPlane(plane, &rectp->r_r, ptable, ui);
if (!keep) freeMagic1(&mm1, (char *) rectp);
if (!keep) freeMagic((char *) rectp);
}
freeMagic1_end(&mm1);
return (keep) ? rectlist : (LinkedRect *)NULL;
}
@ -646,14 +617,14 @@ PaintPolygon(
*/
void
PaintWireList(
Point *pointlist, /* Array of Point structures */
int number, /* total number of points */
int width, /* Route width of path */
bool endcap, /* Whether or not to add 1/2 width endcaps */
Plane *plane, /* Plane structure to paint into */
PaintResultType *ptable, /* Paint result table */
PaintUndoInfo *ui) /* Undo record */
PaintWireList(pointlist, number, width, endcap, plane, ptable, ui)
Point *pointlist; /* Array of Point structures */
int number; /* total number of points */
int width; /* Route width of path */
bool endcap; /* Whether or not to add 1/2 width endcaps */
Plane *plane; /* Plane structure to paint into */
PaintResultType *ptable; /* Paint result table */
PaintUndoInfo *ui; /* Undo record */
{
CIFPath *newpath, *cifpath = (CIFPath *)NULL;
int i;
@ -690,7 +661,7 @@ PaintWireList(
*/
bool
CIFParseWire(void)
CIFParseWire()
{
int width;
CIFPath *pathheadp, *polypath;
@ -716,8 +687,7 @@ CIFParseWire(void)
width /= cifReadScale2;
savescale = cifReadScale1;
pathheadp = CIFParsePath(2);
if (pathheadp == NULL)
if (!CIFParsePath(&pathheadp, 2))
{
CIFReadError("wire, but improper path; ignored.\n");
CIFSkipToSemi();
@ -751,7 +721,7 @@ CIFParseWire(void)
*/
bool
CIFParseLayer(void)
CIFParseLayer()
{
#define MAXCHARS 4
char name[MAXCHARS+1];
@ -814,7 +784,7 @@ CIFParseLayer(void)
*/
bool
CIFParsePoly(void)
CIFParsePoly()
{
CIFPath *pathheadp;
LinkedRect *rectp;
@ -827,8 +797,7 @@ CIFParsePoly(void)
CIFSkipToSemi();
return FALSE;
}
pathheadp = CIFParsePath(1);
if (pathheadp == NULL)
if (!CIFParsePath(&pathheadp, 1))
{
CIFReadError("polygon, but improper path; ignored.\n");
CIFSkipToSemi();
@ -848,13 +817,11 @@ CIFParsePoly(void)
CIFSkipToSemi();
return FALSE;
}
free_magic1_t mm1 = freeMagic1_init();
for (; rectp != NULL ; rectp = rectp->r_next)
{
DBPaintPlane(cifReadPlane, &rectp->r_r, CIFPaintTable,
(PaintUndoInfo *) NULL);
freeMagic1(&mm1, (char *) rectp);
freeMagic((char *) rectp);
}
freeMagic1_end(&mm1);
return TRUE;
}

View File

@ -18,7 +18,7 @@
*/
#ifndef lint
static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cif/CIFrdtech.c,v 1.4 2010/09/15 15:45:30 tim Exp $";
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cif/CIFrdtech.c,v 1.4 2010/09/15 15:45:30 tim Exp $";
#endif /* not lint */
#include <stdio.h>
@ -62,8 +62,8 @@ CIFReadLayer *cifCurReadLayer; /* Current layer being processed. */
CIFOp *cifCurReadOp; /* Last geometric operation seen. */
/* Forward declarations */
void cifReadStyleInit(void);
void CIFReadLoadStyle(char *stylename);
void cifReadStyleInit();
void CIFReadLoadStyle();
/*
* ----------------------------------------------------------------------------
@ -90,9 +90,8 @@ void CIFReadLoadStyle(char *stylename);
*/
bool
CIFReadTechLimitScale(
int ns,
int ds)
CIFReadTechLimitScale(ns, ds)
int ns, ds;
{
int gridup, scaledown;
int scale, limit, mult;
@ -132,9 +131,9 @@ CIFReadTechLimitScale(
*/
int
CIFReadNameToType(
char *name, /* Name of a CIF layer. */
bool newOK) /* TRUE means OK to create a new layer if this
CIFReadNameToType(name, newOK)
char *name; /* Name of a CIF layer. */
bool newOK; /* TRUE means OK to create a new layer if this
* name is one we haven't seen before.
*/
{
@ -197,34 +196,34 @@ CIFReadNameToType(
*/
int
CIFCalmaLayerToCifLayer(
int layer, /* Calma layer number */
int datatype, /* Calma datatype */
CIFReadStyle *calmaStyle)
CIFCalmaLayerToCifLayer(layer, datatype, calmaStyle)
int layer; /* Calma layer number */
int datatype; /* Calma datatype */
CIFReadStyle *calmaStyle;
{
CalmaLayerType clt;
HashEntry *he;
clt.clt_layer = layer;
clt.clt_type = datatype;
if ((he = HashLookOnly(&(calmaStyle->cifCalmaToCif), (char *) &clt)))
if (he = HashLookOnly(&(calmaStyle->cifCalmaToCif), (char *) &clt))
return ((spointertype) HashGetValue(he));
/* Try wildcarding the datatype */
clt.clt_type = -1;
if ((he = HashLookOnly(&(calmaStyle->cifCalmaToCif), (char *) &clt)))
if (he = HashLookOnly(&(calmaStyle->cifCalmaToCif), (char *) &clt))
return ((spointertype) HashGetValue(he));
/* Try wildcarding the layer */
clt.clt_layer = -1;
clt.clt_type = datatype;
if ((he = HashLookOnly(&(calmaStyle->cifCalmaToCif), (char *) &clt)))
if (he = HashLookOnly(&(calmaStyle->cifCalmaToCif), (char *) &clt))
return ((spointertype) HashGetValue(he));
/* Try wildcarding them both, for a default value */
clt.clt_layer = -1;
clt.clt_type = -1;
if ((he = HashLookOnly(&(calmaStyle->cifCalmaToCif), (char *) &clt)))
if (he = HashLookOnly(&(calmaStyle->cifCalmaToCif), (char *) &clt))
return ((spointertype) HashGetValue(he));
/* No luck */
@ -252,10 +251,10 @@ CIFCalmaLayerToCifLayer(
*/
void
CIFParseReadLayers(
char *string, /* Comma-separated list of CIF layers. */
TileTypeBitMask *mask, /* Where to store bit mask. */
bool newok) /* If TRUE, create new layers if they don't exist */
CIFParseReadLayers(string, mask, newok)
char *string; /* Comma-separated list of CIF layers. */
TileTypeBitMask *mask; /* Where to store bit mask. */
bool newok; /* If TRUE, create new layers if they don't exist */
{
int i;
char *p;
@ -314,7 +313,7 @@ CIFParseReadLayers(
*/
void
cifNewReadStyle(void)
cifNewReadStyle()
{
int i;
CIFOp *op;
@ -324,20 +323,13 @@ cifNewReadStyle(void)
{
/* Destroy old style and free all memory allocated to it */
for (i = 0; i < MAXCIFRLAYERS; i++)
for (i=0; i<MAXCIFRLAYERS; i+=1)
{
layer = cifCurReadStyle->crs_layers[i];
if (layer != NULL)
{
free_magic1_t mm1 = freeMagic1_init();
for (op = layer->crl_ops; op != NULL; op = op->co_next)
{
if (op->co_opcode == CIFOP_MASKHINTS ||
op->co_opcode == CIFOP_TAGGED)
freeMagic((char *)op->co_client);
freeMagic1(&mm1, (char *)op);
}
freeMagic1_end(&mm1);
freeMagic((char *)op);
freeMagic((char *)layer);
}
}
@ -361,7 +353,7 @@ cifNewReadStyle(void)
*/
void
cifReadStyleInit(void)
cifReadStyleInit()
{
int i;
@ -403,7 +395,7 @@ cifReadStyleInit(void)
*/
void
CIFReadTechInit(void)
CIFReadTechInit()
{
CIFReadKeep *style;
@ -415,13 +407,11 @@ CIFReadTechInit(void)
/* forget the list of styles */
free_magic1_t mm1 = freeMagic1_init();
for (style = cifReadStyleList; style != NULL; style = style->crs_next)
{
freeMagic(style->crs_name);
freeMagic1(&mm1, style);
freeMagic(style);
}
freeMagic1_end(&mm1);
cifReadStyleList = NULL;
}
@ -443,7 +433,7 @@ CIFReadTechInit(void)
*/
void
CIFReadTechStyleInit(void)
CIFReadTechStyleInit()
{
cifNReadLayers = 0;
cifCurReadLayer = NULL;
@ -470,10 +460,10 @@ CIFReadTechStyleInit(void)
*/
/* ARGSUSED */
bool
CIFReadTechLine(
char *sectionName, /* Name of this section ("cifinput"). */
int argc, /* Number of fields on line. */
char *argv[]) /* Values of fields. */
CIFReadTechLine(sectionName, argc, argv)
char *sectionName; /* Name of this section ("cifinput"). */
int argc; /* Number of fields on line. */
char *argv[]; /* Values of fields. */
{
CIFOp *newOp = NULL;
CIFReadKeep *newStyle, *p;
@ -882,33 +872,10 @@ CIFReadTechLine(
goto wrongNumArgs;
}
CIFParseReadLayers(argv[1], &mask, TRUE);
for (i = 0; i < MAXCIFRLAYERS; i++)
for (i=0; i<MAXCIFRLAYERS; i+=1)
{
if (TTMaskHasType(&mask, i))
if (TTMaskHasType(&mask,i))
{
/* Only one magic type can be assigned to a GDS layer, so
* multiple assignments should be flagged as errors. BUT,
* this is a common historic error. Since reattachments
* should be handled rationally (by code added 10/17/2023
* to DBlabel.c), there is no urgent need to flag an issue
* unless the new layer does not exist on the same plane
* as the old one.
*/
if (cifCurReadStyle->crs_labelLayer[i] != TT_SPACE)
{
int p1, p2;
p1 = DBPlane(cifCurReadLayer->crl_magicType);
p2 = DBPlane(cifCurReadStyle->crs_labelLayer[i]);
if (!DBTypeOnPlane(cifCurReadLayer->crl_magicType, p2) &&
!DBTypeOnPlane(cifCurReadStyle->crs_labelLayer[i], p1))
TechError("Labels on layer \"%s\" attached to \"%s\" "
"supersedes prior attachment to \"%s\".\n",
cifReadLayers[i],
DBTypeLongNameTbl[cifCurReadLayer->crl_magicType],
DBTypeLongNameTbl[cifCurReadStyle->crs_labelLayer[i]]);
}
cifCurReadStyle->crs_labelLayer[i]
= cifCurReadLayer->crl_magicType;
if (argc == 3)
@ -932,8 +899,8 @@ CIFReadTechLine(
if (argc != 2) goto wrongNumArgs;
CIFParseReadLayers(argv[1], &mask, TRUE);
/* trash the value in crs_labelLayer so that any labels on this
* layer get junked, also. dcs 4/11/90
*/
layer get junked, also. dcs 4/11/90
*/
for (i=0; i < cifNReadLayers; i++)
{
if (TTMaskHasType(&mask,i))
@ -949,15 +916,14 @@ CIFReadTechLine(
/* miscellaneous cif-reading boolean options */
if (strcmp(argv[0], "options") == 0) {
if(strcmp(argv[0], "options") == 0) {
int i;
if (argc < 2) goto wrongNumArgs;
for (i = 1; i < argc; i++) {
if (strcmp(argv[i], "ignore-unknown-layer-labels") == 0)
for(i = 1; i < argc; i++) {
if(strcmp(argv[i], "ignore-unknown-layer-labels") == 0)
cifCurReadStyle->crs_flags |= CRF_IGNORE_UNKNOWNLAYER_LABELS;
/* Allow "no-reconnect-labels", although it has been deprecated */
else if (strcmp(argv[i], "no-reconnect-labels") != 0)
TechError("Unknown cifinput option \"%s\".\n", argv[i]);
if(strcmp(argv[i], "no-reconnect-labels") == 0)
cifCurReadStyle->crs_flags |= CRF_NO_RECONNECT_LABELS;
}
return TRUE;
}
@ -995,12 +961,6 @@ CIFReadTechLine(
newOp->co_opcode = CIFOP_COPYUP;
else if (strcmp(argv[0], "boundary") == 0)
newOp->co_opcode = CIFOP_BOUNDARY;
else if (strcmp(argv[0], "not-square") == 0)
newOp->co_opcode = CIFOP_NOTSQUARE;
else if (strcmp(argv[0], "mask-hints") == 0)
newOp->co_opcode = CIFOP_MASKHINTS;
else if (strcmp(argv[0], "tagged") == 0)
newOp->co_opcode = CIFOP_TAGGED;
else
{
TechError("Unknown statement \"%s\".\n", argv[0]);
@ -1027,16 +987,6 @@ CIFReadTechLine(
goto errorReturn;
}
break;
case CIFOP_MASKHINTS:
if (argc != 2) goto wrongNumArgs;
newOp->co_client = (ClientData)StrDup((char **)NULL, argv[1]);
break;
case CIFOP_TAGGED:
if ((argc != 2) && (argc != 3)) goto wrongNumArgs;
newOp->co_client = (ClientData)StrDup((char **)NULL, argv[1]);
if (argc == 3)
CIFParseReadLayers(argv[2], &newOp->co_cifMask, TRUE);
break;
}
/* Link the new CIFOp onto the list. */
@ -1077,7 +1027,7 @@ CIFReadTechLine(
*/
void
CIFReadTechFinal(void)
CIFReadTechFinal()
{
/* Reduce the scale by the multiplier, as much as possible while */
/* keeping all CIF input ops in integer units. */
@ -1120,10 +1070,9 @@ CIFReadTechFinal(void)
*
* ----------------------------------------------------------------------------
*/
void
CIFReadLoadStyle(
char *stylename)
CIFReadLoadStyle(stylename)
char *stylename;
{
SectionID invcifr;
@ -1165,8 +1114,8 @@ CIFReadLoadStyle(
*/
int
CIFReadGetGrowSize(
TileType type)
CIFReadGetGrowSize(type)
TileType type;
{
CIFReadStyle *istyle = cifCurReadStyle;
CIFOp *op;
@ -1220,8 +1169,8 @@ CIFReadGetGrowSize(
*/
float
CIFGetInputScale(
int convert)
CIFGetInputScale(convert)
int convert;
{
/* Avoid divide-by-0 error if there is no cif input style */
/* in the tech file. */
@ -1253,10 +1202,10 @@ CIFGetInputScale(
*/
void
CIFPrintReadStyle(
bool dolist, /* Return as a list if true */
bool doforall, /* Return list of all styles if true */
bool docurrent) /* Return current style if true */
CIFPrintReadStyle(dolist, doforall, docurrent)
bool dolist; /* Return as a list if true */
bool doforall; /* Return list of all styles if true */
bool docurrent; /* Return current style if true */
{
CIFReadKeep *style;
@ -1324,8 +1273,8 @@ CIFPrintReadStyle(
*/
void
CIFSetReadStyle(
char *name) /* Name of the new style. If NULL,
CIFSetReadStyle(name)
char *name; /* Name of the new style. If NULL,
* just print the name of the current
* style.
*/
@ -1385,10 +1334,10 @@ CIFSetReadStyle(
*/
int
cifParseCalmaNums(
char *str, /* String to parse */
int *numArray, /* Array to fill in */
int numNums) /* Maximum number of entries in numArray */
cifParseCalmaNums(str, numArray, numNums)
char *str; /* String to parse */
int *numArray; /* Array to fill in */
int numNums; /* Maximum number of entries in numArray */
{
int numFilled, num;
@ -1448,10 +1397,9 @@ cifParseCalmaNums(
*/
int
CIFTechInputScale(
int n,
int d,
bool opt)
CIFTechInputScale(n, d, opt)
int n, d;
bool opt;
{
CIFReadStyle *istyle = cifCurReadStyle;
CIFReadLayer *cl;

View File

@ -19,7 +19,7 @@
*/
#ifndef lint
static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cif/CIFrdutils.c,v 1.4 2010/06/24 12:37:15 tim Exp $";
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cif/CIFrdutils.c,v 1.4 2010/06/24 12:37:15 tim Exp $";
#endif /* not lint */
#include <stdio.h>
@ -129,7 +129,7 @@ Plane *cifReadPlane; /* Plane into which to paint material
/* VARARGS1 */
void
CIFReadError(const char *format, ...)
CIFReadError(char *format, ...)
{
va_list args;
@ -140,7 +140,7 @@ CIFReadError(const char *format, ...)
if (cifLineNumber > 0)
TxError("Error at line %d of CIF file: ", cifLineNumber);
else
TxError("CIF file read error: ");
TxError("CIF file read error: ", cifLineNumber);
va_start(args, format);
Vfprintf(stderr, format, args);
va_end(args);
@ -153,7 +153,7 @@ CIFReadError(const char *format, ...)
void
CIFReadWarning(const char *format, ...)
CIFReadWarning(char *format, ...)
{
va_list args;
@ -205,9 +205,9 @@ CIFReadWarning(const char *format, ...)
*/
int
CIFScaleCoord(
int cifCoord, /* A coordinate in CIF units. */
int snap_type) /* How to deal with fractional results */
CIFScaleCoord(cifCoord, snap_type)
int cifCoord; /* A coordinate in CIF units. */
int snap_type; /* How to deal with fractional results */
{
int result, scale, remain, denom;
int mult, mfactor;
@ -276,10 +276,8 @@ CIFScaleCoord(
PlowAfterTech();
ExtTechScale(1, denom);
WireTechScale(1, denom);
#ifdef ROUTE_MODULE
MZAfterTech();
IRAfterTech();
#endif
#ifdef LEF_MODULE
LefTechScale(1, denom);
#endif
@ -345,8 +343,8 @@ CIFScaleCoord(
*/
bool
cifIsBlank(
int ch)
cifIsBlank(ch)
int ch;
{
if ( isdigit(ch) || isupper(ch)
@ -378,7 +376,7 @@ cifIsBlank(
*/
void
CIFSkipBlanks(void)
CIFSkipBlanks()
{
while (cifIsBlank(PEEK())) {
@ -407,7 +405,7 @@ CIFSkipBlanks(void)
*/
void
CIFSkipSep(void)
CIFSkipSep()
{
int ch;
@ -437,7 +435,7 @@ CIFSkipSep(void)
*/
void
CIFSkipToSemi(void)
CIFSkipToSemi()
{
int ch;
@ -466,7 +464,7 @@ CIFSkipToSemi(void)
*/
void
CIFSkipSemi(void)
CIFSkipSemi()
{
CIFSkipBlanks();
@ -497,8 +495,8 @@ CIFSkipSemi(void)
*/
bool
CIFParseSInteger(
int *valuep)
CIFParseSInteger(valuep)
int *valuep;
{
bool is_signed;
char buffer[ BUFSIZ ];
@ -542,8 +540,8 @@ CIFParseSInteger(
*/
bool
CIFParseInteger(
int *valuep)
CIFParseInteger(valuep)
int *valuep;
{
if (!CIFParseSInteger(valuep))
@ -583,9 +581,9 @@ CIFParseInteger(
*/
bool
CIFParsePoint(
Point *pointp,
int iscale)
CIFParsePoint(pointp, iscale)
Point *pointp;
int iscale;
{
int rescale;
@ -651,11 +649,12 @@ CIFParsePoint(
* one or more points.
*
* Results:
* non-NULL CIFPath* the caller takes ownership of
* if the path was parsed successfully, otherwise NULL.
* TRUE is returned if the path was parsed successfully,
* FALSE otherwise.
*
* Side effects:
* None
* Modifies the parameter pathheadpp to point to the path
* that is constructed.
*
* Corrections:
* CIF coordinates are multiplied by 2 to cover the case where
@ -667,16 +666,17 @@ CIFParsePoint(
* ----------------------------------------------------------------------------
*/
CIFPath *
CIFParsePath(
int iscale)
bool
CIFParsePath(pathheadpp, iscale)
CIFPath **pathheadpp;
int iscale;
{
CIFPath *pathheadp, *pathtailp, *newpathp;
CIFPath *pathtailp, *newpathp;
bool nonManhattan = FALSE; /* diagnostic only */
CIFPath path;
int savescale;
pathheadp = NULL;
*pathheadpp = NULL;
pathtailp = NULL;
path.cifp_next = NULL;
while (TRUE)
@ -688,12 +688,12 @@ CIFParsePath(
savescale = cifReadScale1;
if (!CIFParsePoint(&path.cifp_point, iscale))
{
CIFFreePath(pathheadp);
return NULL;
CIFFreePath(*pathheadpp);
return FALSE;
}
if (savescale != cifReadScale1)
{
CIFPath *phead = pathheadp;
CIFPath *phead = *pathheadpp;
int newscale = cifReadScale1 / savescale;
while (phead != NULL)
{
@ -704,7 +704,7 @@ CIFParsePath(
}
newpathp = (CIFPath *) mallocMagic((unsigned) (sizeof (CIFPath)));
*newpathp = path;
if (pathheadp)
if (*pathheadpp)
{
/*
* Check that this segment is Manhattan. If not, remember the
@ -721,10 +721,10 @@ CIFParsePath(
}
pathtailp->cifp_next = newpathp;
}
else pathheadp = newpathp;
else *pathheadpp = newpathp;
pathtailp = newpathp;
}
return pathheadp;
return (*pathheadpp != NULL);
}
/*
@ -744,9 +744,9 @@ CIFParsePath(
*/
bool
test_insideness(
CIFPath *start,
Point *tpoint)
test_insideness(start, tpoint)
CIFPath *start;
Point *tpoint;
{
Rect tmprect, irect;
@ -782,11 +782,10 @@ test_insideness(
*/
bool
seg_intersect(
CIFPath *tstart,
Point *bf,
Point *bs,
Point *respt)
seg_intersect(tstart, bf, bs, respt)
CIFPath *tstart;
Point *bf, *bs;
Point *respt;
{
int afx = tstart->cifp_x;
int afy = tstart->cifp_y;
@ -849,10 +848,9 @@ seg_intersect(
*/
bool
path_intersect(
CIFPath *pathHead,
CIFPath *start,
Point *respt)
path_intersect(pathHead, start, respt)
CIFPath *pathHead, *start;
Point *respt;
{
CIFPath *path, *segcrossed, *new;
Point tmppt;
@ -955,8 +953,8 @@ path_intersect(
*/
bool
is_clockwise(
CIFPath *pathHead)
is_clockwise(pathHead)
CIFPath *pathHead;
{
CIFPath *path, *midx = NULL, *last;
Point *p1, *p2, *p3;
@ -1049,11 +1047,11 @@ is_clockwise(
*/
void
CIFMakeManhattanPath(
CIFPath *pathHead,
Plane *plane,
const PaintResultType *resultTbl,
PaintUndoInfo *ui)
CIFMakeManhattanPath(pathHead, plane, resultTbl, ui)
CIFPath *pathHead;
Plane *plane;
PaintResultType *resultTbl;
PaintUndoInfo *ui;
{
CIFPath *new, *new2, *next, *path;
int xinit, xdiff, xincr, xlast, x;
@ -1156,11 +1154,7 @@ CIFMakeManhattanPath(
/* Final check---ensure that rectangle is not degenerate */
if (plane && (tr.r_xtop - tr.r_xbot > 0) && (tr.r_ytop - tr.r_ybot > 0))
{
DBNMPaintPlane(plane, type, &tr, resultTbl, ui);
GEO_EXPAND(&tr, 1, &tr);
DBMergeNMTiles(plane, &tr, ui);
}
}
}
@ -1187,9 +1181,8 @@ CIFMakeManhattanPath(
*/
int
CIFEdgeDirection(
CIFPath *first,
CIFPath *last) /* Edge to be categorized. */
CIFEdgeDirection(first, last)
CIFPath *first, *last; /* Edge to be categorized. */
{
if (first->cifp_x < last->cifp_x)
@ -1236,8 +1229,8 @@ CIFEdgeDirection(
*/
void
CIFCleanPath(
CIFPath *pathHead)
CIFCleanPath(pathHead)
CIFPath *pathHead;
{
CIFPath *next, *path, *prev, *last;
int dir1, dir2;
@ -1256,7 +1249,7 @@ CIFCleanPath(
if (!path) return;
}
while ((next = path->cifp_next))
while (next = path->cifp_next)
{
if ((dir2 = CIFEdgeDirection(path, next)) == CIF_ZERO)
{
@ -1335,16 +1328,14 @@ path_inc:
*/
void
CIFFreePath(
CIFPath *path) /* Path to be freed. */
CIFFreePath(path)
CIFPath *path; /* Path to be freed. */
{
free_magic1_t mm1 = freeMagic1_init();
while (path != NULL)
{
freeMagic1(&mm1, (char *) path);
freeMagic((char *) path);
path = path->cifp_next;
}
freeMagic1_end(&mm1);
}
/*
@ -1366,7 +1357,7 @@ CIFFreePath(
*/
void
cifCommandError(void)
cifCommandError()
{
CIFReadError("unknown command `%c'; ignored.\n" , PEEK());
CIFSkipToSemi();
@ -1391,7 +1382,7 @@ cifCommandError(void)
*/
bool
cifParseEnd(void)
cifParseEnd()
{
TAKE();
CIFSkipBlanks();
@ -1420,7 +1411,7 @@ cifParseEnd(void)
*/
bool
cifParseComment(void)
cifParseComment()
{
int opens;
int ch;
@ -1471,9 +1462,9 @@ cifParseComment(void)
* ----------------------------------------------------------------------------
*/
const Transform *
CIFDirectionToTrans(
const Point *point) /* Direction vector from origin. */
Transform *
CIFDirectionToTrans(point)
Point *point; /* Direction vector from origin. */
{
if ((point->p_x != 0) && (point->p_y == 0))
{
@ -1512,8 +1503,8 @@ CIFDirectionToTrans(
*/
bool
CIFParseTransform(
Transform *transformp)
CIFParseTransform(transformp)
Transform *transformp;
{
char ch;
Point point;
@ -1606,8 +1597,8 @@ CIFParseTransform(
*/
void
CIFReadFile(
FILE *file) /* File from which to read CIF. */
CIFReadFile(file)
FILE *file; /* File from which to read CIF. */
{
/* We will use 1-word CIF numbers as keys in this hash table */
CIFReadCellInit(1);

View File

@ -21,8 +21,8 @@
* rcsid "$Header: /usr/cvsroot/magic-8.0/cif/CIFread.h,v 1.3 2010/08/25 17:33:55 tim Exp $
*/
#ifndef _MAGIC__CIF__CIFREAD_H
#define _MAGIC__CIF__CIFREAD_H
#ifndef _CIFREAD_H
#define _CIFREAD_H
#include "cif/CIFint.h"
@ -104,10 +104,8 @@ typedef struct cifrstyle
/* Gives the Magic layer to use for labels
* on each possible CIF layer.
*/
/* enum labelType */ unsigned char crs_labelSticky[MAXCIFRLAYERS];
/* Marker if label layer makes sticky labels
* enum labelType LABEL_TYPE_xxxxxx
*/
bool crs_labelSticky[MAXCIFRLAYERS];
/* Marker if label layer makes sticky labels */
CIFReadLayer *crs_layers[MAXCIFRLAYERS];
HashTable cifCalmaToCif; /* Table mapping from Calma layer numbers to
* CIF layers
@ -117,6 +115,7 @@ typedef struct cifrstyle
/* option bitmasks used in crs_flags */
#define CRF_IGNORE_UNKNOWNLAYER_LABELS 1
#define CRF_NO_RECONNECT_LABELS 2
/* Methods to deal with fractional results of conversion from CIF to magic */
/* units (see routine CIFScaleCoord() for details). */
@ -154,45 +153,22 @@ typedef struct cifpath
/* Procedures */
extern bool CIFParseBox(void);
extern bool CIFParseWire(void);
extern bool CIFParsePoly(void);
extern bool CIFParseFlash(void);
extern bool CIFParseLayer(void);
extern bool CIFParseStart(void);
extern bool CIFParseFinish(void);
extern bool CIFParseDelete(void);
extern bool CIFParseUser(void);
extern bool CIFParseCall(void);
extern bool CIFParseTransform(Transform *transformp);
extern bool CIFParseInteger(int *valuep);
extern CIFPath *CIFParsePath(int iscale);
extern bool CIFParsePoint(Point *pointp, int iscale);
extern bool CIFParseSInteger(int *valuep);
extern void CIFSkipToSemi(void);
extern void CIFSkipSep(void);
extern void CIFSkipBlanks(void);
extern void CIFFreePath(CIFPath *path);
extern void CIFCleanPath(CIFPath *pathHead);
extern void CIFReadCellInit(int ptrkeys);
extern void CIFReadCellCleanup(int filetype);
extern LinkedRect *CIFPolyToRects(CIFPath *path, Plane *plane, const PaintResultType *resultTbl,
PaintUndoInfo *ui, bool isCalma);
extern const Transform *CIFDirectionToTrans(const Point *point);
extern int CIFReadNameToType(char *name, bool newOK);
extern int CIFCalmaLayerToCifLayer(int layer, int datatype, CIFReadStyle *calmaStyle);
extern void CIFPropRecordPath(CellDef *def, CIFPath *pathheadp, bool iswire, char *propname);
extern void CIFPaintWirePath(CIFPath *pathheadp, int width, bool endcap, Plane *plane,
const PaintResultType *ptable, PaintUndoInfo *ui);
extern void CIFMakeManhattanPath(CIFPath *pathHead, Plane *plane, const PaintResultType *resultTbl, PaintUndoInfo *ui);
extern int CIFEdgeDirection(CIFPath *first, CIFPath *last);
extern bool CIFParseBox(), CIFParseWire(), CIFParsePoly();
extern bool CIFParseFlash(), CIFParseLayer(), CIFParseStart();
extern bool CIFParseFinish(), CIFParseDelete(), CIFParseUser();
extern bool CIFParseCall(), CIFParseTransform(), CIFParseInteger();
extern bool CIFParsePath(), CIFParsePoint(), CIFParseSInteger();
extern void CIFSkipToSemi(), CIFSkipSep(), CIFSkipBlanks();
extern void CIFFreePath(), CIFCleanPath();
extern void CIFReadCellInit(), CIFReadCellCleanup();
extern LinkedRect *CIFPolyToRects();
extern Transform *CIFDirectionToTrans();
extern int CIFReadNameToType();
/* Variable argument procedures require complete prototype */
extern void CIFReadError(const char *format, ...) ATTR_FORMAT_PRINTF_1;
extern void CIFReadWarning(const char *format, ...) ATTR_FORMAT_PRINTF_1;
extern void CIFReadError(char *format, ...);
extern void CIFReadWarning(char *format, ...);
/* Variables shared by the CIF-reading modules, see CIFreadutils.c
* for more details:
@ -221,4 +197,4 @@ extern int cifParseLaChar;
? (cifParseLaAvail = FALSE, cifParseLaChar) \
: (cifParseLaChar = getc(cifInputFile)))
#endif /* _MAGIC__CIF__CIFREAD_H */
#endif /* _CIFREAD_H */

View File

@ -17,7 +17,7 @@
*/
#ifndef lint
static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cif/CIFsee.c,v 1.5 2010/06/24 12:37:15 tim Exp $";
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cif/CIFsee.c,v 1.5 2010/06/24 12:37:15 tim Exp $";
#endif /* not lint */
#include <stdio.h>
@ -76,10 +76,9 @@ typedef struct {
*/
int
cifPaintDBFunc(
Tile *tile, /* Tile of CIF information. */
TileType dinfo,
PaintLayerData *pld)
cifPaintDBFunc(tile, pld)
Tile *tile; /* Tile of CIF information. */
PaintLayerData *pld;
{
Rect area;
int pNum;
@ -107,7 +106,7 @@ cifPaintDBFunc(
if (DBPaintOnPlane(type, pNum))
{
ui.pu_pNum = pNum;
DBNMPaintPlane(paintDef->cd_planes[pNum], TiGetTypeExact(tile) | dinfo,
DBNMPaintPlane(paintDef->cd_planes[pNum], TiGetTypeExact(tile),
&area, DBStdPaintTbl(type, pNum), (PaintUndoInfo *) &ui);
}
@ -133,14 +132,14 @@ cifPaintDBFunc(
*/
void
CIFPaintLayer(
CellDef *rootDef, /* Cell for which to generate CIF. Must be
CIFPaintLayer(rootDef, area, cifLayer, magicLayer, paintDef)
CellDef *rootDef; /* Cell for which to generate CIF. Must be
* the rootDef of a window.
*/
Rect *area, /* Area in which to generate CIF. */
char *cifLayer, /* CIF layer to highlight on the screen. */
int magicLayer, /* Magic layer to paint with the result */
CellDef *paintDef) /* CellDef to paint into (may be NULL) */
Rect *area; /* Area in which to generate CIF. */
char *cifLayer; /* CIF layer to highlight on the screen. */
int magicLayer; /* Magic layer to paint with the result */
CellDef *paintDef; /* CellDef to paint into (may be NULL) */
{
int oldCount, i;
char msg[100];
@ -166,9 +165,9 @@ CIFPaintLayer(
scx.scx_use = CIFDummyUse;
scx.scx_trans = GeoIdentityTransform;
(void) DBTreeSrTiles(&scx, &DBAllButSpaceAndDRCBits, 0,
cifHierCopyFunc, (ClientData) CIFComponentDef);
cifHierCopyFunc, (ClientData) CIFComponentDef);
CIFCopyMaskHints(&scx, CIFComponentDef);
DBTreeSrCells(&scx, 0, CIFCopyMaskHints,
DBTreeSrCells(&scx, 0, cifHierCopyMaskHints,
(ClientData)CIFComponentDef);
oldCount = DBWFeedbackCount;
@ -218,10 +217,9 @@ CIFPaintLayer(
*/
int
cifSeeFunc(
Tile *tile, /* Tile to be entered as feedback. */
TileType dinfo, /* Split tile information */
SeeLayerData *sld) /* Layer and explanation for the feedback. */
cifSeeFunc(tile, sld)
Tile *tile; /* Tile to be entered as feedback. */
SeeLayerData *sld; /* Layer and explanation for the feedback. */
{
Rect area;
@ -235,10 +233,10 @@ cifSeeFunc(
(float)area.r_ybot / (float)CIFCurStyle->cs_scaleFactor);
}
/* (NOTE: Preserve information about the geometry of a diagonal tile) */
DBWFeedbackAdd(&area, sld->text, cifSeeDef, CIFCurStyle->cs_scaleFactor,
sld->style | ((TiGetTypeExact(tile) | dinfo) &
(TT_DIAGONAL | TT_DIRECTION | TT_SIDE)));
sld->style |
(TiGetTypeExact(tile) & (TT_DIAGONAL | TT_DIRECTION | TT_SIDE)));
/* (preserve information about the geometry of a diagonal tile) */
return 0;
}
@ -260,12 +258,12 @@ cifSeeFunc(
*/
void
CIFSeeLayer(
CellDef *rootDef, /* Cell for which to generate CIF. Must be
CIFSeeLayer(rootDef, area, layer)
CellDef *rootDef; /* Cell for which to generate CIF. Must be
* the rootDef of a window.
*/
Rect *area, /* Area in which to generate CIF. */
char *layer) /* CIF layer to highlight on the screen. */
Rect *area; /* Area in which to generate CIF. */
char *layer; /* CIF layer to highlight on the screen. */
{
int oldCount, i;
char msg[100];
@ -287,9 +285,9 @@ CIFSeeLayer(
scx.scx_use = CIFDummyUse;
scx.scx_trans = GeoIdentityTransform;
(void) DBTreeSrTiles(&scx, &DBAllButSpaceAndDRCBits, 0,
cifHierCopyFunc, (ClientData) CIFComponentDef);
cifHierCopyFunc, (ClientData) CIFComponentDef);
CIFCopyMaskHints(&scx, CIFComponentDef);
DBTreeSrCells(&scx, 0, CIFCopyMaskHints,
DBTreeSrCells(&scx, 0, cifHierCopyMaskHints,
(ClientData)CIFComponentDef);
oldCount = DBWFeedbackCount;
@ -350,14 +348,14 @@ CIFSeeLayer(
*/
void
CIFSeeHierLayer(
CellDef *rootDef, /* Def in which to compute CIF. Must be
CIFSeeHierLayer(rootDef, area, layer, arrays, subcells)
CellDef *rootDef; /* Def in which to compute CIF. Must be
* the root definition of a window.
*/
Rect *area, /* Area in which to generate CIF. */
char *layer, /* CIF layer to be highlighted. */
bool arrays, /* TRUE means show array interactions. */
bool subcells) /* TRUE means show subcell interactions. */
Rect *area; /* Area in which to generate CIF. */
char *layer; /* CIF layer to be highlighted. */
bool arrays; /* TRUE means show array interactions. */
bool subcells; /* TRUE means show subcell interactions. */
{
int i, oldCount;
SeeLayerData sld;
@ -428,11 +426,11 @@ typedef struct {
} coverstats;
void
CIFCoverageLayer(
CellDef *rootDef, /* Def in which to compute CIF coverage */
Rect *area, /* Area in which to compute coverage */
char *layer, /* CIF layer for coverage computation. */
bool dolist) /* If TRUE, report only the value, in decimal */
CIFCoverageLayer(rootDef, area, layer, dolist)
CellDef *rootDef; /* Def in which to compute CIF coverage */
Rect *area; /* Area in which to compute coverage */
char *layer; /* CIF layer for coverage computation. */
bool dolist; /* If TRUE, report only the value, in decimal */
{
coverstats cstats;
int i, scale;
@ -440,11 +438,9 @@ CIFCoverageLayer(
SearchContext scx;
TileTypeBitMask mask, depend;
float fcover;
int cifCoverageFunc();
bool doBox = (area != &rootDef->cd_bbox) ? TRUE : FALSE;
/* Forward declaration */
int cifCoverageFunc(Tile *tile, TileType dinfo, ClientData *arg);
/* Check out the CIF layer name. */
if (!CIFNameToMask(layer, &mask, &depend)) return;
@ -459,9 +455,9 @@ CIFCoverageLayer(
scx.scx_use = CIFDummyUse;
scx.scx_trans = GeoIdentityTransform;
(void) DBTreeSrTiles(&scx, &DBAllButSpaceAndDRCBits, 0,
cifHierCopyFunc, (ClientData) CIFComponentDef);
cifHierCopyFunc, (ClientData) CIFComponentDef);
CIFCopyMaskHints(&scx, CIFComponentDef);
DBTreeSrCells(&scx, 0, CIFCopyMaskHints,
DBTreeSrCells(&scx, 0, cifHierCopyMaskHints,
(ClientData)CIFComponentDef);
CIFGen(CIFComponentDef, rootDef, area, CIFPlanes, &depend, TRUE, TRUE,
@ -504,20 +500,19 @@ CIFCoverageLayer(
}
else
{
TxPrintf("%s Area = %"DLONG_PREFIX"d CIF units^2\n", doBox ? "Cursor Box" :
TxPrintf("%s Area = %lld CIF units^2\n", doBox ? "Cursor Box" :
"Cell", btotal);
TxPrintf("Layer Bounding Area = %"DLONG_PREFIX"d CIF units^2\n", atotal);
TxPrintf("Layer Total Area = %"DLONG_PREFIX"d CIF units^2\n", cstats.coverage);
TxPrintf("Layer Bounding Area = %lld CIF units^2\n", atotal);
TxPrintf("Layer Total Area = %lld CIF units^2\n", cstats.coverage);
TxPrintf("Coverage in %s = %1.1f%%\n", doBox ? "box" :
"cell", 100.0 * fcover);
}
}
int
cifCoverageFunc(
Tile *tile,
TileType dinfo, /* (unused) */
ClientData *arg)
cifCoverageFunc(tile, arg)
Tile *tile;
ClientData *arg;
{
coverstats *cstats = (coverstats *)arg;
Rect r;

View File

@ -18,7 +18,7 @@
*/
#ifndef lint
static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cif/CIFtech.c,v 1.7 2010/10/20 20:34:19 tim Exp $";
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cif/CIFtech.c,v 1.7 2010/10/20 20:34:19 tim Exp $";
#endif /* not lint */
#include <stdio.h>
@ -64,8 +64,8 @@ TileTypeBitMask CIFSolidBits;
/* Forward Declarations */
void cifTechStyleInit(void);
bool cifCheckCalmaNum(char *str);
void cifTechStyleInit();
bool cifCheckCalmaNum();
/*
* ----------------------------------------------------------------------------
@ -85,7 +85,7 @@ bool cifCheckCalmaNum(char *str);
*/
void
cifTechFreeStyle(void)
cifTechFreeStyle()
{
int i;
CIFOp *op;
@ -100,7 +100,6 @@ cifTechFreeStyle(void)
layer = CIFCurStyle->cs_layers[i];
if (layer != NULL)
{
free_magic1_t mm1 = freeMagic1_init();
for (op = layer->cl_ops; op != NULL; op = op->co_next)
{
if (op->co_client != (ClientData)NULL)
@ -111,8 +110,6 @@ cifTechFreeStyle(void)
case CIFOP_BBOX:
case CIFOP_MAXRECT:
case CIFOP_BOUNDARY:
case CIFOP_INTERACT:
case CIFOP_MANHATTAN:
/* These options use co_client to hold a single */
/* integer value, so it is not allocated. */
break;
@ -121,9 +118,8 @@ cifTechFreeStyle(void)
break;
}
}
freeMagic1(&mm1, (char *)op);
freeMagic((char *)op);
}
freeMagic1_end(&mm1);
freeMagic((char *)layer);
}
}
@ -152,7 +148,7 @@ cifTechFreeStyle(void)
*/
void
cifTechNewStyle(void)
cifTechNewStyle()
{
cifTechFreeStyle();
cifTechStyleInit();
@ -169,7 +165,7 @@ cifTechNewStyle(void)
*/
void
cifTechStyleInit(void)
cifTechStyleInit()
{
int i;
@ -220,23 +216,23 @@ cifTechStyleInit(void)
*/
void
cifParseLayers(
char *string, /* List of layers. */
CIFStyle *style, /* Gives CIF style for parsing string.*/
TileTypeBitMask *paintMask, /* Place to store mask of paint layers. If
cifParseLayers(string, style, paintMask, cifMask, spaceOK)
char *string; /* List of layers. */
CIFStyle *style; /* Gives CIF style for parsing string.*/
TileTypeBitMask *paintMask; /* Place to store mask of paint layers. If
* NULL, then only CIF layer names are
* considered.
*/
TileTypeBitMask *cifMask, /* Place to store mask of CIF layers. If
TileTypeBitMask *cifMask; /* Place to store mask of CIF layers. If
* NULL, then only paint layer names are
* considered.
*/
int spaceOK) /* are space layers permissible in this cif
int spaceOK; /* are space layers permissible in this cif
layer?
*/
{
TileTypeBitMask curCifMask, curPaintMask;
char curLayer[512], *p, *cp;
char curLayer[40], *p, *cp;
TileType paintType;
int i;
bool allResidues;
@ -248,10 +244,6 @@ cifParseLayers(
{
p = curLayer;
if (*string == '(')
while ((*string != ')') && (*string != 0))
*p++ = *string++;
if (*string == '*')
{
allResidues = TRUE;
@ -269,22 +261,7 @@ cifParseLayers(
if (paintMask != NULL)
{
if (*curLayer == '(')
{
TileType t;
/* Layer groups with parentheses can only be paint types,
* and will be parsed accordingly. Residues will be
* handled within the group. Set paintType to -3, which
* is flagged and handled below.
*/
DBTechNoisyNameMask(curLayer, &curPaintMask);
paintType = -3;
allResidues = FALSE;
}
else
paintType = DBTechNameTypes(curLayer, &curPaintMask);
paintType = DBTechNameTypes(curLayer, &curPaintMask);
if (paintType >= 0) goto okpaint;
}
else paintType = -2;
@ -320,7 +297,7 @@ okpaint:
TechError("Ambiguous layer (type) \"%s\".\n", curLayer);
continue;
}
if ((paintType >= 0) || (paintType == -3))
if (paintType >= 0)
{
if (paintType == TT_SPACE && spaceOK ==0)
TechError("\"Space\" layer not permitted in CIF rules.\n");
@ -380,7 +357,7 @@ okpaint:
*/
void
CIFTechInit(void)
CIFTechInit()
{
CIFKeep *style;
@ -390,13 +367,11 @@ CIFTechInit(void)
/* forget the list of styles */
free_magic1_t mm1 = freeMagic1_init();
for (style = CIFStyleList; style != NULL; style = style->cs_next)
{
freeMagic(style->cs_name);
freeMagic1(&mm1, style);
freeMagic(style);
}
freeMagic1_end(&mm1);
CIFStyleList = NULL;
}
@ -418,7 +393,7 @@ CIFTechInit(void)
*/
void
CIFTechStyleInit(void)
CIFTechStyleInit()
{
CalmaTechInit();
@ -459,9 +434,8 @@ CIFTechStyleInit(void)
*/
bool
CIFTechLimitScale(
int ns,
int ds)
CIFTechLimitScale(ns, ds)
int ns, ds;
{
int gridup, scaledown;
int scale, limit, expand;
@ -500,9 +474,9 @@ CIFTechLimitScale(
*/
int
CIFParseScale(
char *true_scale,
int *expander)
CIFParseScale(true_scale, expander)
char *true_scale;
int *expander;
{
char *decimal;
short places;
@ -551,10 +525,10 @@ CIFParseScale(
*/
bool
CIFTechLine(
char *sectionName, /* The name of this section. */
int argc, /* Number of fields on line. */
char *argv[]) /* Values of fields. */
CIFTechLine(sectionName, argc, argv)
char *sectionName; /* The name of this section. */
int argc; /* Number of fields on line. */
char *argv[]; /* Values of fields. */
{
TileTypeBitMask mask, tempMask, cifMask, bloatLayers;
int i, j, l, distance;
@ -817,7 +791,7 @@ CIFTechLine(
else
{
l = strlen(CIFCurStyle->cs_name) - strlen(tptr);
if ((l > 0) && !strcmp(tptr, CIFCurStyle->cs_name + l))
if (!strcmp(tptr, CIFCurStyle->cs_name + l))
{
CIFCurStyle->cs_status = TECH_PENDING;
return TRUE;
@ -1107,8 +1081,6 @@ CIFTechLine(
newOp->co_opcode = CIFOP_BBOX;
else if (strcmp(argv[0], "net") == 0)
newOp->co_opcode = CIFOP_NET;
else if (strcmp(argv[0], "tagged") == 0)
newOp->co_opcode = CIFOP_TAGGED;
else if (strcmp(argv[0], "maxrect") == 0)
newOp->co_opcode = CIFOP_MAXRECT;
else if (strcmp(argv[0], "boundary") == 0)
@ -1117,31 +1089,10 @@ CIFTechLine(
newOp->co_opcode = CIFOP_MASKHINTS;
else if (strcmp(argv[0], "close") == 0)
newOp->co_opcode = CIFOP_CLOSE;
else if (strcmp(argv[0], "orthogonal") == 0)
newOp->co_opcode = CIFOP_MANHATTAN;
else if (strcmp(argv[0], "not-square") == 0)
newOp->co_opcode = CIFOP_NOTSQUARE;
else if (strcmp(argv[0], "bridge") == 0)
newOp->co_opcode = CIFOP_BRIDGE;
else if (strcmp(argv[0], "bridge-lim") == 0)
newOp->co_opcode = CIFOP_BRIDGELIM;
else if (strcmp(argv[0], "overlapping") == 0)
newOp->co_opcode = CIFOP_INTERACT;
else if (strcmp(argv[0], "nonoverlapping") == 0)
{
newOp->co_opcode = CIFOP_INTERACT;
newOp->co_client = (ClientData)CIFOP_INT_NOT;
}
else if (strcmp(argv[0], "interacting") == 0)
{
newOp->co_opcode = CIFOP_INTERACT;
newOp->co_client = (ClientData)CIFOP_INT_TOUCHING;
}
else if (strcmp(argv[0], "noninteracting") == 0)
{
newOp->co_opcode = CIFOP_INTERACT;
newOp->co_client = (ClientData)(CIFOP_INT_TOUCHING | CIFOP_INT_NOT);
}
else
{
TechError("Unknown statement \"%s\".\n", argv[0]);
@ -1153,7 +1104,6 @@ CIFTechLine(
case CIFOP_AND:
case CIFOP_ANDNOT:
case CIFOP_OR:
case CIFOP_INTERACT:
if (argc != 2) goto wrongNumArgs;
cifParseLayers(argv[1], CIFCurStyle, &newOp->co_paintMask,
&newOp->co_cifMask,FALSE);
@ -1163,6 +1113,7 @@ CIFTechLine(
case CIFOP_GROWMIN:
case CIFOP_GROW_G:
case CIFOP_SHRINK:
case CIFOP_CLOSE:
if (argc != 2) goto wrongNumArgs;
newOp->co_distance = atoi(argv[1]);
if (newOp->co_distance <= 0)
@ -1172,26 +1123,6 @@ CIFTechLine(
}
break;
case CIFOP_CLOSE:
/* "close" is like "grow" and "shrink" except that it can have
* no argument, in which case any closed shape of any size
* will be closed (useful for finding enclosed areas).
*/
if (argc == 1)
newOp->co_distance = 0;
else if (argc != 2)
goto wrongNumArgs;
else
{
newOp->co_distance = atoi(argv[1]);
if (newOp->co_distance <= 0)
{
TechError("Grow/shrink distance must be greater than zero.\n");
goto errorReturn;
}
}
break;
case CIFOP_BRIDGE:
if (argc != 3) goto wrongNumArgs;
newOp->co_distance = atoi(argv[1]);
@ -1232,7 +1163,7 @@ CIFTechLine(
break;
case CIFOP_BLOATALL:
if (argc != 3 && argc != 4) goto wrongNumArgs;
if (argc != 3) goto wrongNumArgs;
cifParseLayers(argv[1], CIFCurStyle, &newOp->co_paintMask,
&newOp->co_cifMask, FALSE);
bloats = (BloatData *)mallocMagic(sizeof(BloatData));
@ -1248,21 +1179,6 @@ CIFTechLine(
if (!TTMaskIsZero(&mask) && !TTMaskIsZero(&cifMask))
TechError("Can't mix CIF and magic layers in bloat statement.\n");
if (argc == 4)
{
/* 12/23/2024: Allow an additional argument, which is a
* maximum halo distance to bloat (i.e., clip mask)
*/
newOp->co_distance = atoi(argv[3]);
if (newOp->co_distance <= 0)
{
TechError("Bloat distance must be greater than zero.\n");
goto errorReturn;
}
}
else
newOp->co_distance = 0;
/* 10/15/2019: Lifting restriction that the types that */
/* trigger the bloating must be in the same plane as the */
/* types that are bloated into. */
@ -1359,12 +1275,10 @@ bloatCheck:
bloatDone: break;
case CIFOP_NET:
case CIFOP_TAGGED:
if ((argc != 2) && (argc != 3)) goto wrongNumArgs;
if (argc != 3) goto wrongNumArgs;
newOp->co_client = (ClientData)StrDup((char **)NULL, argv[1]);
if (argc == 3)
cifParseLayers(argv[2], CIFCurStyle, &newOp->co_paintMask,
&newOp->co_cifMask, FALSE);
cifParseLayers(argv[2], CIFCurStyle, &newOp->co_paintMask,
&newOp->co_cifMask, FALSE);
break;
case CIFOP_MASKHINTS:
@ -1385,19 +1299,6 @@ bloatCheck:
goto wrongNumArgs;
break;
case CIFOP_MANHATTAN:
if (argc == 2)
{
if (!strcmp(argv[1], "fill"))
newOp->co_client = (ClientData)1;
else if (strcmp(argv[1], "remove"))
TechError("Orthogonal takes only one optional argument "
"\"fill\" or \"remove\" (default).\n");
}
else if (argc != 1)
goto wrongNumArgs;
break;
case CIFOP_BBOX:
if (argc == 2)
{
@ -1624,8 +1525,8 @@ bloatCheck:
*/
bool
cifCheckCalmaNum(
char *str)
cifCheckCalmaNum(str)
char *str;
{
int n = atoi(str);
@ -1661,9 +1562,9 @@ cifCheckCalmaNum(
*/
void
cifComputeRadii(
CIFLayer *layer, /* Layer for which to compute distances. */
CIFStyle *des) /* CIF style (used to find temp layer
cifComputeRadii(layer, des)
CIFLayer *layer; /* Layer for which to compute distances. */
CIFStyle *des; /* CIF style (used to find temp layer
* distances.
*/
{
@ -1675,12 +1576,12 @@ cifComputeRadii(
for (op = layer->cl_ops; op != NULL; op = op->co_next)
{
/* BBOX, NET, TAGGED, and MASKHINTS operators should never be */
/* used hierarchically so ignore any grow/shrink operators that */
/* BBOX, NET, and MASKHINTS operators should never be used */
/* hierarchically so ignore any grow/shrink operators that */
/* come after them. */
if (op->co_opcode == CIFOP_BBOX || op->co_opcode == CIFOP_NET ||
op->co_opcode == CIFOP_TAGGED || op->co_opcode == CIFOP_MASKHINTS)
op->co_opcode == CIFOP_MASKHINTS)
break;
/* If CIF layers are used, switch to the max of current
@ -1708,7 +1609,6 @@ cifComputeRadii(
case CIFOP_AND:
case CIFOP_ANDNOT:
case CIFOP_OR:
case CIFOP_INTERACT:
case CIFOP_MASKHINTS:
break;
@ -1770,8 +1670,8 @@ cifComputeRadii(
*/
void
cifComputeHalo(
CIFStyle *style)
cifComputeHalo(style)
CIFStyle *style;
{
int maxGrow, maxShrink, i;
@ -1787,8 +1687,7 @@ cifComputeHalo(
if (maxGrow > maxShrink)
style->cs_radius = 2*maxGrow;
else style->cs_radius = 2*maxShrink;
if (style->cs_scaleFactor > 0)
style->cs_radius /= style->cs_scaleFactor;
style->cs_radius /= style->cs_scaleFactor;
style->cs_radius++;
/* TxPrintf("Radius for %s CIF is %d.\n",
@ -1841,7 +1740,7 @@ cifComputeHalo(
*/
void
CIFTechFinal(void)
CIFTechFinal()
{
CIFStyle *style = CIFCurStyle;
CIFOp *op;
@ -1990,10 +1889,10 @@ CIFTechFinal(void)
}
}
/* Presence of op->co_opcode in CIFOP_OR indicates a copy */
/* of the SquaresData pointer from a following operator. */
/* of the SquaresData pointer from a following operator */
/* CIFOP_BBOX and CIFOP_MAXRECT uses the co_client field */
/* as a flag field, while CIFOP_NET, CIFOP_MASKHINTS, and */
/* CIFOP_TAGGED use it for a string. */
/* as a flag field, while CIFOP_NET and CIFOP_MASKHINTS */
/* uses it for a string. */
else
{
switch (op->co_opcode)
@ -2003,9 +1902,7 @@ CIFTechFinal(void)
case CIFOP_MASKHINTS:
case CIFOP_BOUNDARY:
case CIFOP_MAXRECT:
case CIFOP_MANHATTAN:
case CIFOP_NET:
case CIFOP_TAGGED:
break;
case CIFOP_BRIDGELIM:
case CIFOP_BRIDGE:
@ -2103,7 +2000,6 @@ CIFTechFinal(void)
case CIFOP_AND:
case CIFOP_ANDNOT:
case CIFOP_INTERACT:
case CIFOP_SHRINK:
case CIFOP_CLOSE:
case CIFOP_BRIDGELIM:
@ -2228,8 +2124,8 @@ CIFTechFinal(void)
*/
void
CIFLoadStyle(
char *stylename)
CIFLoadStyle(stylename)
char *stylename;
{
SectionID invcif;
@ -2277,11 +2173,11 @@ CIFLoadStyle(
*/
int
CIFGetContactSize(
TileType type,
int *edge,
int *spacing,
int *border)
CIFGetContactSize(type, edge, spacing, border)
TileType type;
int *edge;
int *border;
int *spacing;
{
CIFStyle *style = CIFCurStyle;
CIFOp *op, *sop;
@ -2374,9 +2270,8 @@ CIFGetContactSize(
*/
void
CIFTechOutputScale(
int n,
int d)
CIFTechOutputScale(n, d)
int n, d;
{
int i, j, lgcf, lexpand;
CIFStyle *ostyle = CIFCurStyle;
@ -2539,10 +2434,7 @@ CIFTechOutputScale(
case CIFOP_BOUNDARY:
case CIFOP_MASKHINTS:
case CIFOP_MAXRECT:
case CIFOP_MANHATTAN:
case CIFOP_NET:
case CIFOP_TAGGED:
case CIFOP_INTERACT:
break;
case CIFOP_BRIDGELIM:
case CIFOP_BRIDGE:
@ -2657,8 +2549,8 @@ CIFTechOutputScale(
default:
/* op->co_opcode in CIFOP_OR is a pointer copy, */
/* in CIFOP_BBOX and CIFOP_MAXRECT is a flag, */
/* and in CIFOP_NET, CIFOP_MASKHINTS, and */
/* CIFOP_TAGGED is a string. */
/* and in CIFOP_NET and CIFOP_MASKHINTS is a */
/* string. */
break;
}
}

View File

@ -17,7 +17,7 @@
*/
#ifndef lint
static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cif/CIFwrite.c,v 1.2 2010/06/24 12:37:15 tim Exp $";
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cif/CIFwrite.c,v 1.2 2010/06/24 12:37:15 tim Exp $";
#endif /* not lint */
#include <stdlib.h>
@ -44,15 +44,15 @@ static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magi
#include "textio/textio.h"
/* Forward declarations */
extern int cifWriteInitFunc(CellDef *def, ClientData cdata); /* UNUSED */
extern int cifWriteMarkFunc(CellUse *use);
extern int cifWritePaintFunc(Tile *tile, TileType dinfo, FILE *f);
extern int cifWriteLabelFunc(Tile *tile, TileType dinfo, FILE *f);
extern int cifWriteUseFunc(CellUse *use, FILE *f);
extern void cifOutPreamble(FILE *outf, CellDef *cell);
extern void cifOut(FILE *outf);
extern void cifOutFunc(CellDef *def, FILE *f);
extern void GrClipTriangle(Rect *r, Rect *c, int clipped, TileType dinfo, Point *points, int *np);
extern int cifWriteInitFunc();
extern int cifWriteMarkFunc();
extern int cifWritePaintFunc();
extern int cifWriteLabelFunc();
extern int cifWriteUseFunc();
extern void cifOutPreamble();
extern void cifOut();
extern void cifOutFunc();
extern int GrClipTriangle();
/* Current cell number in CIF numbering scheme */
@ -118,13 +118,12 @@ bool CIFArrayWriteDisable = FALSE;
*/
bool
CIFWrite(
CellDef *rootDef, /* Pointer to CellDef to be written */
FILE *f) /* Open output file */
CIFWrite(rootDef, f)
CellDef *rootDef; /* Pointer to CellDef to be written */
FILE *f; /* Open output file */
{
bool good;
int oldCount = DBWFeedbackCount;
CellDef *err_def;
CellUse dummy;
/*
@ -134,11 +133,9 @@ CIFWrite(
*/
dummy.cu_def = rootDef;
err_def = DBCellReadArea(&dummy, &rootDef->cd_bbox, TRUE);
if (err_def != NULL)
if (DBCellReadArea(&dummy, &rootDef->cd_bbox, TRUE))
{
TxError("Failure to read in entire subtree of the cell.\n");
TxError("Failed on cell %s.\n", err_def->cd_name);
return (FALSE);
}
DBFixMismatch();
@ -167,8 +164,8 @@ CIFWrite(
cifOutPreamble(f, rootDef);
cifOut(f);
StackFree(cifStack);
if ((int) CD2INT(rootDef->cd_client) < 0)
rootDef->cd_client = INT2CD(- (int) CD2INT(rootDef->cd_client));
if ((int) rootDef->cd_client < 0)
rootDef->cd_client = (ClientData) (- (int) rootDef->cd_client);
/* See if any problems occurred. */
@ -182,7 +179,7 @@ CIFWrite(
* Now we are almost done.
* Just output a call on the root cell
*/
fprintf(f, "C %d;\nEnd\n", (int) CD2INT(rootDef->cd_client));
fprintf(f, "C %d;\nEnd\n", (int) rootDef->cd_client);
good = !ferror(f);
return (good);
}
@ -204,11 +201,9 @@ CIFWrite(
* ----------------------------------------------------------------------------
*/
/*ARGSUSED*/
int
cifWriteInitFunc(
CellDef *def,
ClientData cdata) /* UNUSED */
cifWriteInitFunc(def)
CellDef *def;
{
def->cd_client = (ClientData) 0;
return (0);
@ -231,11 +226,11 @@ cifWriteInitFunc(
*/
int
cifWriteMarkFunc(
CellUse *use)
cifWriteMarkFunc(use)
CellUse *use;
{
if (use->cu_def->cd_client != (ClientData) 0) return 0;
use->cu_def->cd_client = INT2CD(cifCellNum);
use->cu_def->cd_client = (ClientData) cifCellNum;
cifCellNum -= 1;
StackPush((ClientData) use->cu_def, cifStack);
return (0);
@ -257,9 +252,9 @@ cifWriteMarkFunc(
*/
void
cifOutPreamble(
FILE *outf,
CellDef *cell)
cifOutPreamble(outf, cell)
FILE *outf;
CellDef *cell;
{
extern char *MagicVersion;
extern char *MagicCompileTime;
@ -306,8 +301,8 @@ cifOutPreamble(
*/
void
cifOut(
FILE *outf)
cifOut(outf)
FILE *outf;
{
CellDef *def;
bool needHier;
@ -315,15 +310,17 @@ cifOut(
while (!StackEmpty(cifStack))
{
def = (CellDef *) StackPop(cifStack);
if ((int) CD2INT(def->cd_client) >= 0) continue; /* Already output */
if ((int) def->cd_client >= 0) continue; /* Already output */
if (SigInterruptPending) continue;
def->cd_client = INT2CD(- (int) CD2INT(def->cd_client));
def->cd_client = (ClientData) (- (int) def->cd_client);
/* Read the cell in if it is not already available. */
if ((def->cd_flags & CDAVAILABLE) == 0)
if (!DBCellRead(def, TRUE, TRUE, NULL))
continue;
{
bool dereference = (def->cd_flags & CDDEREFERENCE) ? TRUE : FALSE;
if (!DBCellRead(def, (char *) NULL, TRUE, dereference, NULL)) continue;
}
/* Add any subcells to the stack. This must be done before
* outputting CIF to make sure that the subcells all have
@ -355,16 +352,16 @@ cifOut(
*/
void
cifOutFunc(
CellDef *def, /* Pointer to cell def to be written */
FILE *f) /* Open output file */
cifOutFunc(def, f)
CellDef *def; /* Pointer to cell def to be written */
FILE *f; /* Open output file */
{
Rect bigArea;
Label *lab;
int type;
CIFLayer *layer;
fprintf(f, "DS %d %d %d;\n", (int) CD2INT(def->cd_client),
fprintf(f, "DS %d %d %d;\n", (int) def->cd_client,
CIFCurStyle->cs_reducer, 2 * CIFCurStyle->cs_expander);
if (def->cd_name != (char *) NULL)
@ -486,16 +483,16 @@ cifOutFunc(
*/
int
cifWriteUseFunc(
CellUse *use,
FILE *f)
cifWriteUseFunc(use, f)
CellUse *use;
FILE *f;
{
int x, y, topx, topy;
int realx, realy;
Transform *t;
int cifnum;
cifnum = (int) CD2INT(use->cu_def->cd_client);
cifnum = (int) use->cu_def->cd_client;
if (cifnum < 0) cifnum = (-cifnum);
topx = use->cu_xhi - use->cu_xlo;
if (topx < 0) topx = -topx;
@ -584,10 +581,9 @@ cifWriteUseFunc(
*/
int
cifWriteLabelFunc(
Tile *tile, /* Tile to be written out. */
TileType dinfo, /* Split tile information (unused) */
FILE *f) /* File in which to write. */
cifWriteLabelFunc(tile, f)
Tile *tile; /* Tile to be written out. */
FILE *f; /* File in which to write. */
{
Rect r;
int type;
@ -644,10 +640,9 @@ cifWriteLabelFunc(
*/
int
cifWritePaintFunc(
Tile *tile, /* Tile to be written out. */
TileType dinfo, /* Split tile information */
FILE *f) /* File in which to write. */
cifWritePaintFunc(tile, f)
Tile *tile; /* Tile to be written out. */
FILE *f; /* File in which to write. */
{
Rect r;
@ -666,7 +661,7 @@ cifWritePaintFunc(
Point points[5];
int i, np;
GrClipTriangle(&r, NULL, FALSE, TiGetTypeExact(tile) | dinfo, points, &np);
GrClipTriangle(&r, NULL, FALSE, TiGetTypeExact(tile), points, &np);
/* Write triangle as a CIF polygon */
@ -726,9 +721,9 @@ cifWritePaintFunc(
*/
bool
CIFWriteFlat(
CellDef *rootDef, /* Pointer to CellDef to be written */
FILE *f) /* Open output file */
CIFWriteFlat(rootDef, f)
CellDef *rootDef; /* Pointer to CellDef to be written */
FILE *f; /* Open output file */
{
bool good;
int oldCount = DBWFeedbackCount;
@ -777,7 +772,7 @@ CIFWriteFlat(
* Just output a call on the root cell
*/
fprintf(f, "C %d;\nEnd\n", (int) CD2INT(CIFComponentDef->cd_client));
fprintf(f, "C %d;\nEnd\n", (int) CIFComponentDef->cd_client);
DBCellClearDef(CIFComponentDef);
good = !ferror(f);

View File

@ -20,8 +20,8 @@
* rcsid "$Header: /usr/cvsroot/magic-8.0/cif/cif.h,v 1.4 2010/06/24 12:37:15 tim Exp $
*/
#ifndef _MAGIC__CIF__CIF_H
#define _MAGIC__CIF__CIF_H
#ifndef _CIF_H
#define _CIF_H
#include "database/database.h"
@ -51,48 +51,47 @@ extern bool CIFUnfracture;
/* Procedures that parse the cif sections of a technology file. */
extern void CIFTechStyleInit(void);
extern void CIFTechInit(void);
extern bool CIFTechLine(char *sectionName, int argc, char *argv[]);
extern void CIFTechFinal(void);
extern void CIFTechOutputScale(int n, int d);
extern int CIFTechInputScale(int n, int d, bool opt);
extern bool CIFTechLimitScale(int ns, int ds);
extern void CIFReadTechStyleInit(void);
extern void CIFReadTechInit(void);
extern bool CIFReadTechLine(char *sectionName, int argc, char *argv[]);
extern void CIFReadTechFinal(void);
extern void CIFParseReadLayers(char *string, TileTypeBitMask *mask, bool newok);
extern void CIFTechStyleInit();
extern void CIFTechInit();
extern bool CIFTechLine();
extern void CIFTechFinal();
extern void CIFTechOutputScale();
extern int CIFTechInputScale();
extern bool CIFTechLimitScale();
extern void CIFReadTechStyleInit();
extern void CIFReadTechInit();
extern bool CIFReadTechLine();
extern void CIFReadTechFinal();
extern void CIFParseReadLayers();
/* Externally-visible procedures: */
extern float CIFGetOutputScale(int convert);
extern float CIFGetScale(int convert);
extern float CIFGetInputScale(int convert);
extern float CIFGetOutputScale();
extern float CIFGetScale();
extern float CIFGetInputScale();
extern int CIFGetDefaultContactSize();
extern int CIFPaintCurrent(int filetype);
extern void CIFSeeLayer(CellDef *rootDef, Rect *area, char *layer);
extern void CIFPaintLayer(CellDef *rootDef, Rect *area, char *cifLayer, int magicLayer, CellDef *paintDef);
extern void CIFSeeHierLayer(CellDef *rootDef, Rect *area, char *layer, int arrays, int subcells);
extern void CIFPrintStats(void);
extern int CIFPaintCurrent();
extern void CIFSeeLayer();
extern void CIFPaintLayer();
extern void CIFSeeHierLayer();
extern void CIFPrintStats();
extern bool CIFWrite(CellDef *rootDef, FILE *f);
extern void CIFReadFile(FILE *file);
extern bool CIFWrite();
extern void CIFReadFile();
extern void CIFSetStyle(char *name);
extern void CIFSetReadStyle(char *name);
extern void CIFSetStyle();
extern void CIFSetReadStyle();
extern void CIFPrintStyle(bool dolist, bool doforall, bool docurrent);
extern void CIFPrintReadStyle(bool dolist, bool doforall, bool docurrent);
extern void CIFPrintStyle();
extern void CIFPrintReadStyle();
extern int CIFOutputScaleFactor(void);
extern int CIFOutputScaleFactor();
extern void PaintWireList(Point *pointlist, int number, int width, int endcap, Plane *plane,
PaintResultType *ptable, PaintUndoInfo *ui);
extern LinkedRect *PaintPolygon(Point *pointlist, int number, Plane *plane, PaintResultType *ptable,
PaintUndoInfo *ui, int keep);
extern void PaintWireList();
extern LinkedRect *PaintPolygon();
/* C99 compat */
extern int CIFGetContactSize(TileType type, int *edge, int *spacing, int *border);
extern int CIFGetContactSize();
#endif /* _MAGIC__CIF__CIF_H */
#endif /* _CIF_H */

View File

@ -17,7 +17,7 @@
*/
#ifndef lint
static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cmwind/CMWcmmnds.c,v 1.1.1.1 2008/02/03 20:43:50 tim Exp $";
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cmwind/CMWcmmnds.c,v 1.1.1.1 2008/02/03 20:43:50 tim Exp $";
#endif /* not lint */
#include <stdio.h>
@ -43,11 +43,10 @@ static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magi
/* Forward declarations: */
extern void cmwButtonUp(MagWindow *w, Point *p, int button);
extern void cmwButtonDown(MagWindow *w, Point *p, int button);
extern void cbUpdate(MagWindow *w, int code, double x, int replace);
extern bool RGBxHSV(double r, double g, double b, double *h, double *s, double *v);
extern void HSVxRGB(double h, double s, double v, double *r, double *g, double *b);
extern void cmwButtonUp(), cmwButtonDown();
extern void cbUpdate();
extern void RGBxHSV();
extern void HSVxRGB();
/* If a button is pressed over the top box in the window, which
* displays the current color, we must save the window in which
@ -85,9 +84,9 @@ bool cmwModified = FALSE;
*/
void
CMWcommand(
MagWindow *w,
TxCommand *cmd)
CMWcommand(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
switch (cmd->tx_button)
{
@ -138,13 +137,13 @@ CMWcommand(
*/
void
cmwButtonDown(
MagWindow *w, /* Window where the button was pressed. */
Point *p,
int button)
cmwButtonDown(w, p, button)
MagWindow *w; /* Window where the button was pressed. */
Point *p;
int button;
{
const ColorBar *cb;
const ColorPump *cp;
ColorBar *cb;
ColorPump *cp;
Point surfacePoint;
int x;
double dx;
@ -225,14 +224,14 @@ cmwButtonDown(
*/
void
cmwButtonUp(
MagWindow *w, /* Window where the button was released */
Point *p, /* Point where button was released, in window coords.*/
int button) /* Button that was released. */
cmwButtonUp(w, p, button)
MagWindow *w; /* Window where the button was released */
Point *p; /* Point where button was released, in window coords.*/
int button; /* Button that was released. */
{
CMWclientRec *crec;
int r, g, b, color, oldR, oldG, oldB;
extern int cmwRedisplayFunc(MagWindow *w, int color);
extern int cmwRedisplayFunc();
/* If the button wasn't depressed over the top box in the window
* (the one displaying the current color), then we ignore the
@ -297,12 +296,12 @@ cmwButtonUp(
*/
void
cmwPushbutton(
MagWindow *w,
TxCommand *cmd)
cmwPushbutton(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
int button;
static const char * const cmwButton[] = {"left", "middle", "right", NULL};
static char *cmwButton[] = {"left", "middle", "right", NULL};
if (cmd->tx_argc != 2)
{
@ -356,9 +355,9 @@ cmwPushbutton(
*/
void
cmwColor(
MagWindow *w,
TxCommand *cmd)
cmwColor(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
int color, r, g, b;
CMWclientRec *crec;
@ -373,7 +372,7 @@ cmwColor(
}
else if (cmd->tx_argc == 2)
{
if (sscanf(cmd->tx_argv[1], "%i", &color) != 1)
if (sscanf(cmd->tx_argv[1], "%i", &color) == 0)
{
/* Invalid color---allow keywords "next" and "last" */
crec = (CMWclientRec *) w->w_clientData;
@ -451,9 +450,9 @@ cmwColor(
*/
void
cmwSave(
MagWindow *w,
TxCommand *cmd)
cmwSave(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
bool ok;
if ((cmd->tx_argc != 1) && (cmd->tx_argc != 4))
@ -496,9 +495,9 @@ cmwSave(
*/
void
cmwLoad(
MagWindow *w,
TxCommand *cmd)
cmwLoad(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
if ((cmd->tx_argc != 1) && (cmd->tx_argc != 4))
{
@ -538,18 +537,18 @@ cmwLoad(
*/
void
cbUpdate(
MagWindow *w, /* Window whose color is to be changed. */
int code, /* Indicates which color component to change. */
double x, /* Gives increment or new value for color. */
int replace) /* TRUE means replace component with x, FALSE
cbUpdate(w, code, x, replace)
MagWindow *w; /* Window whose color is to be changed. */
int code; /* Indicates which color component to change. */
double x; /* Gives increment or new value for color. */
int replace; /* TRUE means replace component with x, FALSE
* means increment component by x.
*/
{
CMWclientRec *cr = (CMWclientRec *) w->w_clientData;
double values[6];
int r, g, b, nr, ng, nb;
extern int cmwRedisplayFunc(MagWindow *w, int color);
extern int cmwRedisplayFunc();
/* Get current color map values */
(void) GrGetColor(cr->cmw_color, &r, &g, &b);
@ -592,14 +591,14 @@ cbUpdate(
}
int
cmwRedisplayFunc(
MagWindow *w, /* Window that may have to be redisplayed. */
int color) /* If this color is in window, redisplay the
cmwRedisplayFunc(w, color)
MagWindow *w; /* Window that may have to be redisplayed. */
int color; /* If this color is in window, redisplay the
* color bars in the window.
*/
{
const ColorBar *cb;
const ColorPump *cp;
ColorBar *cb;
ColorPump *cp;
Rect screenR;
CMWclientRec *cr = (CMWclientRec *) w->w_clientData;
@ -645,11 +644,11 @@ cmwRedisplayFunc(
*/
bool
CMWCheckWritten(void)
CMWCheckWritten()
{
bool indx;
char *prompt;
static const char * const yesno[] = {"no", "yes", NULL};
static char *(yesno[]) = {"no", "yes", NULL};
if (!cmwModified) return TRUE;
prompt = TxPrintString("The color map has been modified.\n"

View File

@ -18,7 +18,7 @@
*/
#ifndef lint
static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cmwind/CMWmain.c,v 1.1.1.1 2008/02/03 20:43:50 tim Exp $";
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cmwind/CMWmain.c,v 1.1.1.1 2008/02/03 20:43:50 tim Exp $";
#endif /* not lint */
#include <stdio.h>
@ -44,12 +44,12 @@ global WindClient CMWclientID;
/* Forward and external declarations */
extern void cmwColor(MagWindow *w, TxCommand *cmd);
extern void cmwSave(MagWindow *w, TxCommand *cmd);
extern void cmwLoad(MagWindow *w, TxCommand *cmd);
extern void cmwPushbutton(MagWindow *w, TxCommand *cmd);
extern bool RGBxHSV(double r, double g, double b, double *h, double *s, double *v);
extern void CMWundoInit(void);
extern void cmwColor();
extern void cmwSave();
extern void cmwLoad();
extern void cmwPushbutton();
extern void RGBxHSV();
extern void CMWundoInit();
/* -------------------------------------------------------------------- */
@ -89,47 +89,47 @@ extern void CMWundoInit(void);
* which pump is hit and which mouse button is used to hit it.
*/
const ColorBar colorBars[] =
ColorBar colorBars[] =
{
{"Red", CB_RED, STYLE_RED, {{ 2000, 8000}, {10000, 9000}},
{{ 2000, 9500}, {10000, 10500}}},
{"Green", CB_GREEN, STYLE_GREEN, {{ 2000, 5000}, {10000, 6000}},
{{ 2000, 6500}, {10000, 7500}}},
{"Blue", CB_BLUE, STYLE_BLUE, {{ 2000, 2000}, {10000, 3000}},
{{ 2000, 3500}, {10000, 4500}}},
{"Hue", CB_HUE, STYLE_YELLOW, {{14000, 8000}, {22000, 9000}},
{{14000, 9500}, {22000, 10500}}},
{"Saturation", CB_SAT, STYLE_GRAY, {{14000, 5000}, {22000, 6000}},
{{14000, 6500}, {22000, 7500}}},
{"Value", CB_VALUE, STYLE_BROWN1, {{14000, 2000}, {22000, 3000}},
{{14000, 3500}, {22000, 4500}}},
{0}
"Red", CB_RED, STYLE_RED, {2000, 8000, 10000, 9000},
{2000, 9500, 10000, 10500},
"Green", CB_GREEN, STYLE_GREEN, {2000, 5000, 10000, 6000},
{2000, 6500, 10000, 7500},
"Blue", CB_BLUE, STYLE_BLUE, {2000, 2000, 10000, 3000},
{2000, 3500, 10000, 4500},
"Hue", CB_HUE, STYLE_YELLOW, {14000, 8000, 22000, 9000},
{14000, 9500, 22000, 10500},
"Saturation", CB_SAT, STYLE_GRAY, {14000, 5000, 22000, 6000},
{14000, 6500, 22000, 7500},
"Value", CB_VALUE, STYLE_BROWN1, {14000, 2000, 22000, 3000},
{14000, 3500, 22000, 4500},
0
};
const ColorPump colorPumps[] =
ColorPump colorPumps[] =
{
{CB_RED, -.0078, {{ 500, 8000}, { 1500, 9000}}},
{CB_RED, .0078, {{10500, 8000}, {11500, 9000}}},
{CB_GREEN, -.0078, {{ 500, 5000}, { 1500, 6000}}},
{CB_GREEN, .0078, {{10500, 5000}, {11500, 6000}}},
{CB_BLUE, -.0078, {{ 500, 2000}, { 1500, 3000}}},
{CB_BLUE, .0078, {{10500, 2000}, {11500, 3000}}},
{CB_HUE, -.01, {{12500, 8000}, {13500, 9000}}},
{CB_HUE, .01, {{22500, 8000}, {23500, 9000}}},
{CB_SAT, -.01, {{12500, 5000}, {13500, 6000}}},
{CB_SAT, .01, {{22500, 5000}, {23500, 6000}}},
{CB_VALUE, -.01, {{12500, 2000}, {13500, 3000}}},
{CB_VALUE, .01, {{22500, 2000}, {23500, 3000}}},
{-1}
CB_RED, -.0078, {500, 8000, 1500, 9000},
CB_RED, .0078, {10500, 8000, 11500, 9000},
CB_GREEN, -.0078, {500, 5000, 1500, 6000},
CB_GREEN, .0078, {10500, 5000, 11500, 6000},
CB_BLUE, -.0078, {500, 2000, 1500, 3000},
CB_BLUE, .0078, {10500, 2000, 11500, 3000},
CB_HUE, -.01, {12500, 8000, 13500, 9000},
CB_HUE, .01, {22500, 8000, 23500, 9000},
CB_SAT, -.01, {12500, 5000, 13500, 6000},
CB_SAT, .01, {22500, 5000, 23500, 6000},
CB_VALUE, -.01, {12500, 2000, 13500, 3000},
CB_VALUE, .01, {22500, 2000, 23500, 3000},
-1
};
const Rect cmwCurrentColorArea = {{6000, 12000}, {18000, 15000}};
const Rect cmwCurrentColorTextBox = {{6000, 15500}, {18000, 16500}};
const char * const cmwCurrentColorText = "Color Being Edited";
Rect cmwCurrentColorArea = {{6000, 12000}, {18000, 15000}};
Rect cmwCurrentColorTextBox = {{6000, 15500}, {18000, 16500}};
char *cmwCurrentColorText = "Color Being Edited";
/* Bounding rectangle for entire window */
const Rect colorWindowRect = {{0, 1500}, {24000, 17000}};
Rect colorWindowRect = {{0, 1500}, {24000, 17000}};
/*
* ----------------------------------------------------------------------------
@ -149,13 +149,13 @@ const Rect colorWindowRect = {{0, 1500}, {24000, 17000}};
*/
bool
CMWcreate(
MagWindow *window,
int argc,
char *argv[])
CMWcreate(window, argc, argv)
MagWindow *window;
int argc;
char *argv[];
{
CMWclientRec *crec;
unsigned int color;
int color;
crec = (CMWclientRec *) mallocMagic(sizeof(CMWclientRec));
window->w_clientData = (ClientData) crec;
@ -189,8 +189,8 @@ CMWcreate(
*/
bool
CMWdelete(
MagWindow *window)
CMWdelete(window)
MagWindow *window;
{
CMWclientRec *cr;
@ -217,12 +217,11 @@ CMWdelete(
* ----------------------------------------------------------------------------
*/
/*ARGSUSED*/
void
CMWreposition(
MagWindow *window,
Rect *newScreenArea, /* UNUSED */
bool final)
CMWreposition(window, newScreenArea, final)
MagWindow *window;
Rect *newScreenArea;
bool final;
{
if (final)
WindMove(window, &colorWindowRect);
@ -245,14 +244,14 @@ CMWreposition(
*/
void
CMWredisplay(
MagWindow *w, /* The window containing the area. */
Rect *rootArea, /* Redisplay area in surface coordinates. */
Rect *clipArea) /* An area on the screen to clip to. */
CMWredisplay(w, rootArea, clipArea)
MagWindow *w; /* The window containing the area. */
Rect *rootArea; /* Redisplay area in surface coordinates. */
Rect *clipArea; /* An area on the screen to clip to. */
{
CMWclientRec *cr;
const ColorBar *cb;
const ColorPump *cp;
ColorBar *cb;
ColorPump *cp;
Rect rect, screenR;
Point screenP;
double values[6], x;
@ -373,9 +372,9 @@ CMWredisplay(
*/
void
CMWloadWindow(
MagWindow *w, /* Identifies window to which color is to be bound */
int color) /* New color to be bound to this window. */
CMWloadWindow(w, color)
MagWindow *w; /* Identifies window to which color is to be bound */
int color; /* New color to be bound to this window. */
{
CMWclientRec *cr = (CMWclientRec *) w->w_clientData;
char caption[40];
@ -408,7 +407,7 @@ CMWloadWindow(
*/
void
CMWinit(void)
CMWinit()
{
CMWclientID = WindAddClient("color", CMWcreate, CMWdelete,
CMWredisplay, CMWcommand,

View File

@ -18,7 +18,7 @@
*/
#ifndef lint
static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cmwind/CMWrgbhsv.c,v 1.1.1.1 2008/02/03 20:43:50 tim Exp $";
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cmwind/CMWrgbhsv.c,v 1.1.1.1 2008/02/03 20:43:50 tim Exp $";
#endif /* not lint */
#include <stdio.h>
@ -45,13 +45,9 @@ static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magi
*/
bool
RGBxHSV(
double r,
double g,
double b,
double *h,
double *s,
double *v)
RGBxHSV( r, g, b, h, s, v)
double r, g, b;
double *h, *s, *v;
{
double max, delta;
double mr,mg,mb;
@ -94,14 +90,10 @@ RGBxHSV(
#define SETRGB(rr,gg,bb) *r=rr;*g=gg;*b=bb
void
HSVxRGB(
double h,
double s,
double v,
double *r,
double *g,
double *b)
{
HSVxRGB( h,s,v,r,g,b)
double h,s,v;
double *r,*g,*b;
{
double f,m,n,k;
int i;
double vs,vsf;
@ -133,13 +125,9 @@ HSVxRGB(
*/
bool
RGBxHSL(
double r,
double g,
double b,
double *h,
double *s,
double *l)
RGBxHSL( r, g, b, h, s, l )
double r, g, b;
double *h, *s, *l;
{
double min, max;
double delta, mr, mg, mb;
@ -196,13 +184,9 @@ RGBxHSL(
*/
void
HSLxRGB(
double h,
double s,
double l,
double *r,
double *g,
double *b)
HSLxRGB( h, s, l, r, g, b )
double h, s, l;
double *r, *g, *b;
{
double min;
double v;
@ -251,11 +235,9 @@ HSLxRGB(
*/
void
Correct_chromaticity(
double *x,
double *y,
double wx,
double wy)
Correct_chromaticity(x, y, wx, wy)
double *x,*y;
double wx,wy;
{
double oldx,oldy;
double slope;
@ -279,13 +261,9 @@ Correct_chromaticity(
*/
void
xyz_to_mrgb(
double x,
double y,
double z,
double *mr,
double *mg,
double *mb)
xyz_to_mrgb(x, y, z, mr, mg, mb)
double x, y, z;
double *mr, *mg, *mb;
{
*mr = 2.4513*x - 1.2249*y - 0.3237*z;
*mg = -1.4746*x + 2.5052*y + 0.0596*z;
@ -303,10 +281,8 @@ xyz_to_mrgb(
*/
void
Make_mRGB_Nice(
double *mR,
double *mG,
double *mB)
Make_mRGB_Nice(mR,mG,mB)
double *mR,*mG,*mB;
{
double min,max;
double mr, mg, mb;

View File

@ -17,7 +17,7 @@
*/
#ifndef lint
static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cmwind/CMWundo.c,v 1.1.1.1 2008/02/03 20:43:50 tim Exp $";
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/cmwind/CMWundo.c,v 1.1.1.1 2008/02/03 20:43:50 tim Exp $";
#endif /* not lint */
#include <stdio.h>
@ -35,6 +35,12 @@ static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magi
*/
UndoType cmwUndoClientID;
/*
* Functions to play events forward/backward.
*/
void cmwUndoForw(), cmwUndoBack();
void cmwUndoStart(), cmwUndoDone();
/*
* A single undo event for the
* color map module.
@ -52,14 +58,6 @@ UndoType cmwUndoClientID;
*/
bool cmwColorsChanged[256];
/*
* Functions to play events forward/backward.
*/
void cmwUndoForw(colorUE *up);
void cmwUndoBack(colorUE *up);
void cmwUndoStart(void);
void cmwUndoDone(void);
/*
* ----------------------------------------------------------------------------
*
@ -79,7 +77,7 @@ void cmwUndoDone(void);
*/
void
CMWundoInit(void)
CMWundoInit()
{
cmwUndoClientID = UndoAddClient(cmwUndoStart, cmwUndoDone, NULL, NULL,
cmwUndoForw, cmwUndoBack, "color map");
@ -104,16 +102,16 @@ CMWundoInit(void)
*/
void
cmwUndoForw(
colorUE *up)
cmwUndoForw(up)
colorUE *up;
{
(void) GrPutColor(up->cue_color, up->new_r, up->new_g, up->new_b);
cmwColorsChanged[up->cue_color] = TRUE;
}
void
cmwUndoBack(
colorUE *up)
cmwUndoBack(up)
colorUE *up;
{
(void) GrPutColor(up->cue_color, up->old_r, up->old_g, up->old_b);
cmwColorsChanged[up->cue_color] = TRUE;
@ -136,14 +134,10 @@ cmwUndoBack(
*/
void
cmwUndoColor(
int color,
int oldr,
int oldg,
int oldb,
int newr,
int newg,
int newb)
cmwUndoColor(color, oldr, oldg, oldb, newr, newg, newb)
int color;
int oldr, oldg, oldb;
int newr, newg, newb;
{
colorUE *up;
@ -177,7 +171,7 @@ cmwUndoColor(
*/
void
cmwUndoStart(void)
cmwUndoStart()
{
int i;
@ -204,13 +198,13 @@ cmwUndoStart(void)
*/
void
cmwUndoDone(void)
cmwUndoDone()
{
int i;
extern int cmwRedisplayFunc(MagWindow *w, int color);
extern int cmwRedisplayFunc();
for (i = 0; i < 256; i++)
if (cmwColorsChanged[i])
(void) WindSearch(CMWclientID, (ClientData) NULL, (Rect *) NULL,
cmwRedisplayFunc, INT2CD(i));
cmwRedisplayFunc, (ClientData) i);
}

View File

@ -19,8 +19,8 @@
* rcsid $Header: /usr/cvsroot/magic-8.0/cmwind/cmwind.h,v 1.2 2009/09/10 20:32:51 tim Exp $
*/
#ifndef _MAGIC__CMWIND__CMWIND_H
#define _MAGIC__CMWIND__CMWIND_H
#ifndef _CMWIND_H
#define _CMWIND_H
#include "windows/windows.h"
#include "textio/txcommands.h"
@ -69,16 +69,16 @@ typedef struct
extern void CMWloadWindow(MagWindow *, int);
extern void CMWcommand(MagWindow *, TxCommand *);
extern const Rect colorWindowRect;
extern Rect colorWindowRect;
extern WindClient CMWclientID;
extern const ColorBar colorBars[];
extern const ColorPump colorPumps[];
extern const Rect cmwCurrentColorArea;
extern ColorBar colorBars[];
extern ColorPump colorPumps[];
extern Rect cmwCurrentColorArea;
extern void cmwUndoColor(int, int, int, int, int, int, int);
extern bool CMWCheckWritten(void);
/* C99 compat */
extern void CMWinit(void);
extern void CMWinit();
#endif /* _MAGIC__CMWIND__CMWIND_H */
#endif /* _CMWIND_H */

View File

@ -17,7 +17,7 @@
*/
#ifndef lint
static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/commands/CmdAB.c,v 1.1.1.1 2008/02/03 20:43:50 tim Exp $";
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/commands/CmdAB.c,v 1.1.1.1 2008/02/03 20:43:50 tim Exp $";
#endif /* not lint */
#include <stdio.h>
@ -50,7 +50,7 @@ static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magi
* CmdAddPath --
*
* Implement the "addpath" command: append to the global cell search path.
* (Usage superseded by extended "path" command; retained for compatibility)
* (Usage superceded by extended "path" command; retained for compatibility)
*
* Usage:
* addpath path
@ -70,9 +70,9 @@ static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magi
/*ARGSUSED*/
void
CmdAddPath(
MagWindow *w,
TxCommand *cmd)
CmdAddPath( w, cmd )
MagWindow *w;
TxCommand *cmd;
{
if (cmd->tx_argc != 2) {
TxError("Usage: %s appended_search_path\n", cmd->tx_argv[0]);
@ -81,70 +81,6 @@ CmdAddPath(
PaAppend(&Path, cmd->tx_argv[1]);
}
/*
* ----------------------------------------------------------------------------
*
* CmdArchive --
*
* Save an entire database to a "crash recovery"-type archive file, or
* load a database from a "crash recovery"-type archive file. Option
* "writeall" writes everything, including read-only PDK cells, while
* "readref" does not dereference and will prefer files found in the
* search path over content in the archive.
*
*
* Usage:
* archive write|writeall|read|readref file
*
* Results:
* None.
*
* Side effects:
* Writes a single file with the contents of the entire database,
* or loads the database with multiple cells from the file.
*
* ----------------------------------------------------------------------------
*/
void
CmdArchive(
MagWindow *w,
TxCommand *cmd)
{
int option = -1;
char *filename = NULL;
static const char * const cmdArchiveOpt[] = {"write", "writeall",
"read", "readref", 0};
if (cmd->tx_argc != 3)
TxError("Usage: %s write|writeall|read|readref filename\n", cmd->tx_argv[0]);
else
{
option = Lookup(cmd->tx_argv[1], cmdArchiveOpt);
if (option < 0)
{
TxError("Usage: %s write|writeall|read|readref filename\n", cmd->tx_argv[0]);
return;
}
}
filename = cmd->tx_argv[2];
switch(option) {
case 0: /* write */
DBWriteBackup(filename, TRUE, FALSE);
break;
case 1: /* writeall */
DBWriteBackup(filename, TRUE, TRUE);
break;
case 2: /* read */
DBReadBackup(filename, TRUE, TRUE);
break;
case 3: /* readref */
DBReadBackup(filename, TRUE, FALSE);
break;
}
}
/* Linked-list structure for returning information about arrayed cells */
@ -194,11 +130,11 @@ typedef struct LA1
#define ARRAY_DEFAULT 6
void
CmdArray(
MagWindow *w,
TxCommand *cmd)
CmdArray(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
static const char * const cmdArrayOption[] = {
static char *cmdArrayOption[] = {
"count [[xlo] xhi [ylo] yhi] array subcells",
"width [value] set or return array x-spacing",
"height [value] set or return array y-spacing",
@ -208,7 +144,7 @@ CmdArray(
NULL
};
const char * const *msg;
char **msg;
int option, locargc, argstart;
bool doList = FALSE;
ArrayInfo a;
@ -220,7 +156,7 @@ CmdArray(
Tcl_Obj *tobj;
#endif
extern int selGetArrayFunc(CellUse *selUse, CellUse *use, Transform *trans, LinkedArray **arg);
extern int selGetArrayFunc();
locargc = cmd->tx_argc;
argstart = 1;
@ -338,17 +274,14 @@ CmdArray(
case ARRAY_WIDTH:
if (locargc == 2)
{
char *xsepvalue;
for (la = lahead; la != NULL; la = la->ar_next)
{
xsepvalue = DBWPrintValue(la->arrayInfo.ar_xsep,
w, TRUE);
#ifdef MAGIC_WRAPPER
if (doList)
{
tobj = Tcl_NewListObj(0, NULL);
Tcl_ListObjAppendElement(magicinterp, tobj,
Tcl_NewStringObj(xsepvalue, -1));
Tcl_NewIntObj(la->arrayInfo.ar_xsep));
Tcl_SetObjResult(magicinterp, tobj);
}
else
@ -358,7 +291,7 @@ CmdArray(
TxPrintf("Cell use \"%s\":", la->cellUse->cu_id);
else
TxPrintf("Cell \"%s\":", la->cellUse->cu_def->cd_name);
TxPrintf("x separation %s\n", xsepvalue);
TxPrintf("x separation %d\n", la->arrayInfo.ar_xsep);
#ifdef MAGIC_WRAPPER
}
#endif
@ -377,17 +310,14 @@ CmdArray(
case ARRAY_HEIGHT:
if (locargc == 2)
{
char *ysepvalue;
for (la = lahead; la != NULL; la = la->ar_next)
{
ysepvalue = DBWPrintValue(la->arrayInfo.ar_ysep,
w, FALSE);
#ifdef MAGIC_WRAPPER
if (doList)
{
tobj = Tcl_NewListObj(0, NULL);
Tcl_ListObjAppendElement(magicinterp, tobj,
Tcl_NewStringObj(ysepvalue, -1));
Tcl_NewIntObj(la->arrayInfo.ar_ysep));
Tcl_SetObjResult(magicinterp, tobj);
}
else
@ -397,7 +327,7 @@ CmdArray(
TxPrintf("Cell use \"%s\":", la->cellUse->cu_id);
else
TxPrintf("Cell \"%s\":", la->cellUse->cu_def->cd_name);
TxPrintf("y separation %s\n", ysepvalue);
TxPrintf("y separation %d\n", la->arrayInfo.ar_ysep);
#ifdef MAGIC_WRAPPER
}
#endif
@ -416,21 +346,16 @@ CmdArray(
case ARRAY_PITCH:
if (locargc == 2)
{
char *xpitch, *ypitch;
for (la = lahead; la != NULL; la = la->ar_next)
{
xpitch = DBWPrintValue(la->arrayInfo.ar_xsep,
w, TRUE);
ypitch = DBWPrintValue(la->arrayInfo.ar_ysep,
w, FALSE);
#ifdef MAGIC_WRAPPER
if (doList)
{
tobj = Tcl_NewListObj(0, NULL);
Tcl_ListObjAppendElement(magicinterp, tobj,
Tcl_NewStringObj(xpitch, -1));
Tcl_NewIntObj(la->arrayInfo.ar_xsep));
Tcl_ListObjAppendElement(magicinterp, tobj,
Tcl_NewStringObj(ypitch, -1));
Tcl_NewIntObj(la->arrayInfo.ar_ysep));
Tcl_SetObjResult(magicinterp, tobj);
}
else
@ -440,8 +365,8 @@ CmdArray(
TxPrintf("Cell use \"%s\":", la->cellUse->cu_id);
else
TxPrintf("Cell \"%s\":", la->cellUse->cu_def->cd_name);
TxPrintf("x separation %s ", xpitch);
TxPrintf("y separation %s\n", ypitch);
TxPrintf("x separation %d ", la->arrayInfo.ar_xsep);
TxPrintf("y separation %d\n", la->arrayInfo.ar_ysep);
#ifdef MAGIC_WRAPPER
}
#endif
@ -461,21 +386,16 @@ CmdArray(
case ARRAY_POSITION:
if (locargc == 2)
{
char *xpos, *ypos;
for (la = lahead; la != NULL; la = la->ar_next)
{
xpos = DBWPrintValue(la->cellUse->cu_bbox.r_xbot,
w, TRUE);
ypos = DBWPrintValue(la->cellUse->cu_bbox.r_ybot,
w, FALSE);
#ifdef MAGIC_WRAPPER
if (doList)
{
tobj = Tcl_NewListObj(0, NULL);
Tcl_ListObjAppendElement(magicinterp, tobj,
Tcl_NewStringObj(xpos, -1));
Tcl_NewIntObj(la->cellUse->cu_bbox.r_xbot));
Tcl_ListObjAppendElement(magicinterp, tobj,
Tcl_NewStringObj(ypos, -1));
Tcl_NewIntObj(la->cellUse->cu_bbox.r_ybot));
Tcl_SetObjResult(magicinterp, tobj);
}
else
@ -485,8 +405,8 @@ CmdArray(
TxPrintf("Cell use \"%s\":", la->cellUse->cu_id);
else
TxPrintf("Cell \"%s\":", la->cellUse->cu_def->cd_name);
TxPrintf("x=%s ", xpos);
TxPrintf("y=%s\n", ypos);
TxPrintf("x=%d ", la->cellUse->cu_bbox.r_xbot);
TxPrintf("y=%d\n", la->cellUse->cu_bbox.r_ybot);
#ifdef MAGIC_WRAPPER
}
#endif
@ -546,15 +466,11 @@ badusage:
}
freelist:
la = lahead;
while (la != NULL)
{
la = lahead;
while (la != NULL)
{
free_magic1_t mm1 = freeMagic1_init();
freeMagic1(&mm1, (char *)la);
la = la->ar_next;
freeMagic1_end(&mm1);
}
freeMagic((char *)la);
la = la->ar_next;
}
return;
}
@ -564,11 +480,11 @@ freelist:
*/
int
selGetArrayFunc(
CellUse *selUse,
CellUse *use,
Transform *trans,
LinkedArray **arg)
selGetArrayFunc(selUse, use, trans, arg)
CellUse *selUse;
CellUse *use;
Transform *trans;
LinkedArray **arg;
{
/* Check "use" for array information and pass this to arrayInfo */
@ -677,11 +593,11 @@ selGetArrayFunc(
#define BOX_DEFAULT 13
void
CmdBox(
MagWindow *w,
TxCommand *cmd)
CmdBox(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
static const char * const cmdBoxOption[] = {
static char *cmdBoxOption[] = {
"width [value] set or return box width",
"height [value] set or return box height",
"size [width height] set or return box size",
@ -710,7 +626,7 @@ CmdBox(
bool needBox = TRUE; /* require that box be defined */
bool refEdit = FALSE; /* referenced to edit cell coordinates */
bool cursorRef = FALSE; /* reference position is the cursor */
const char * const *msg;
char **msg;
argc = cmd->tx_argc;
if (argc > 7) goto badusage;
@ -779,8 +695,8 @@ CmdBox(
break;
case BOX_EXISTS:
#ifdef MAGIC_WRAPPER
Tcl_SetObjResult(magicinterp,
Tcl_NewBooleanObj(ToolGetBox(NULL, NULL) ? TRUE : FALSE));
Tcl_SetResult(magicinterp, ToolGetBox(NULL, NULL) ? "1" : "0",
NULL);
#else
TxPrintf("%s\n", ToolGetBox(NULL, NULL) ? "True" : "False");
#endif
@ -881,25 +797,15 @@ CmdBox(
ToolMoveCorner(tcorner, &cmd->tx_p, TRUE, rootBoxDef);
break;
}
/* Recast command as "box values" for logging purposes */
ToolGetBox(&rootBoxDef, &rootBox);
sprintf(cmd->tx_argstring, "box values %di %di %di %di",
rootBox.r_xbot, rootBox.r_ybot,
rootBox.r_xtop, rootBox.r_ytop);
TxRebuildCommand(cmd);
return;
}
else if (DBWUnits != DBW_UNITS_USER)
else if (DBWSnapToGrid != DBW_SNAP_USER)
{
distancex = cmdParseCoord(w, cmd->tx_argv[3], TRUE, FALSE);
distancey = distancex;
}
else
{
/* For user units, the distance may be different in the X and Y
* directions for a given value.
*/
switch (direction)
{
case GEO_EAST: case GEO_WEST:
@ -927,14 +833,15 @@ CmdBox(
case BOX_WIDTH:
if (argc == 2)
{
char *boxvalues;
boxvalues = DBWPrintValue(boxptr->r_xtop - boxptr->r_xbot,
w, TRUE);
#ifdef MAGIC_WRAPPER
Tcl_SetObjResult(magicinterp, Tcl_NewStringObj(boxvalues, -1));
char *boxvalues = (char *)Tcl_Alloc(50);
sprintf(boxvalues, "%d",
boxptr->r_xtop - boxptr->r_xbot);
Tcl_SetResult(magicinterp, boxvalues, TCL_DYNAMIC);
#else
TxPrintf("%s box width is %s\n", (refEdit) ? "Edit" : "Root",
boxvalues);
TxPrintf("%s box width is %d\n",
(refEdit) ? "Edit" : "Root",
boxptr->r_xtop - boxptr->r_xbot);
#endif
return;
}
@ -946,14 +853,15 @@ CmdBox(
case BOX_HEIGHT:
if (argc == 2)
{
char *boxvalues;
boxvalues = DBWPrintValue(boxptr->r_ytop - boxptr->r_ybot,
w, FALSE);
#ifdef MAGIC_WRAPPER
Tcl_SetObjResult(magicinterp, Tcl_NewStringObj(boxvalues, -1));
char *boxvalues = (char *)Tcl_Alloc(50);
sprintf(boxvalues, "%d",
boxptr->r_ytop - boxptr->r_ybot);
Tcl_SetResult(magicinterp, boxvalues, TCL_DYNAMIC);
#else
TxPrintf("%s box height is %s\n", (refEdit) ? "Edit" : "Root",
boxvalues);
TxPrintf("%s box height is %d\n",
(refEdit) ? "Edit" : "Root",
boxptr->r_ytop - boxptr->r_ybot);
#endif
return;
}
@ -966,24 +874,16 @@ CmdBox(
if (argc == 2)
{
#ifdef MAGIC_WRAPPER
Tcl_Obj *tobj;
#endif
char *boxvaluex, *boxvaluey;
boxvaluex = DBWPrintValue(boxptr->r_xtop - boxptr->r_xbot,
w, TRUE);
boxvaluey = DBWPrintValue(boxptr->r_ytop - boxptr->r_ybot,
w, FALSE);
#ifdef MAGIC_WRAPPER
tobj = Tcl_NewListObj(0, NULL);
Tcl_ListObjAppendElement(magicinterp, tobj,
Tcl_NewStringObj(boxvaluex, -1));
Tcl_ListObjAppendElement(magicinterp, tobj,
Tcl_NewStringObj(boxvaluey, -1));
Tcl_SetObjResult(magicinterp, tobj);
char *boxvalues = (char *)Tcl_Alloc(50);
sprintf(boxvalues, "%d %d",
boxptr->r_xtop - boxptr->r_xbot,
boxptr->r_ytop - boxptr->r_ybot);
Tcl_SetResult(magicinterp, boxvalues, TCL_DYNAMIC);
#else
TxPrintf("%s box size is %s x %s\n",
TxPrintf("%s box size is %d x %d\n",
(refEdit) ? "Edit" : "Root",
boxvaluex, boxvaluey);
boxptr->r_xtop - boxptr->r_xbot,
boxptr->r_ytop - boxptr->r_ybot);
#endif
return;
}
@ -998,22 +898,14 @@ CmdBox(
if (argc == 2)
{
#ifdef MAGIC_WRAPPER
Tcl_Obj *tobj;
#endif
char *boxvaluex, *boxvaluey;
boxvaluex = DBWPrintValue(boxptr->r_xbot, w, TRUE);
boxvaluey = DBWPrintValue(boxptr->r_ybot, w, FALSE);
#ifdef MAGIC_WRAPPER
tobj = Tcl_NewListObj(0, NULL);
Tcl_ListObjAppendElement(magicinterp, tobj,
Tcl_NewStringObj(boxvaluex, -1));
Tcl_ListObjAppendElement(magicinterp, tobj,
Tcl_NewStringObj(boxvaluey, -1));
Tcl_SetObjResult(magicinterp, tobj);
char *boxvalues = (char *)Tcl_Alloc(50);
sprintf(boxvalues, "%d %d",
boxptr->r_xbot, boxptr->r_ybot);
Tcl_SetResult(magicinterp, boxvalues, TCL_DYNAMIC);
#else
TxPrintf("%s box lower-left corner at (%s, %s)\n",
TxPrintf("%s box lower-left corner at (%d, %d)\n",
(refEdit) ? "Edit" : "Root",
boxvaluex, boxvaluey);
boxptr->r_xbot, boxptr->r_ybot);
#endif
return;
}
@ -1045,31 +937,16 @@ CmdBox(
if (argc == 2)
{
#ifdef MAGIC_WRAPPER
Tcl_Obj *tobj;
#endif
char *boxvaluellx, *boxvaluelly;
char *boxvalueurx, *boxvalueury;
boxvaluellx = DBWPrintValue(boxptr->r_xbot, w, TRUE);
boxvaluelly = DBWPrintValue(boxptr->r_ybot, w, FALSE);
boxvalueurx = DBWPrintValue(boxptr->r_xtop, w, TRUE);
boxvalueury = DBWPrintValue(boxptr->r_ytop, w, FALSE);
#ifdef MAGIC_WRAPPER
tobj = Tcl_NewListObj(0, NULL);
Tcl_ListObjAppendElement(magicinterp, tobj,
Tcl_NewStringObj(boxvaluellx, -1));
Tcl_ListObjAppendElement(magicinterp, tobj,
Tcl_NewStringObj(boxvaluelly, -1));
Tcl_ListObjAppendElement(magicinterp, tobj,
Tcl_NewStringObj(boxvalueurx, -1));
Tcl_ListObjAppendElement(magicinterp, tobj,
Tcl_NewStringObj(boxvalueury, -1));
Tcl_SetObjResult(magicinterp, tobj);
char *boxvalues = (char *)Tcl_Alloc(50);
sprintf(boxvalues, "%d %d %d %d",
boxptr->r_xbot, boxptr->r_ybot,
boxptr->r_xtop, boxptr->r_ytop);
Tcl_SetResult(magicinterp, boxvalues, TCL_DYNAMIC);
#else
TxPrintf("%s box coordinates (%s, %s) to (%s, %s)\n",
TxPrintf("%s box coordinates (%d, %d) to (%d, %d)\n",
(refEdit) ? "Edit" : "Root",
boxvaluellx, boxvaluelly, boxvalueurx, boxvalueury);
boxptr->r_xbot, boxptr->r_ybot,
boxptr->r_xtop, boxptr->r_ytop);
#endif
return;
}
@ -1271,7 +1148,7 @@ CmdBox(
boxptr->r_xbot, boxptr->r_ybot,
boxptr->r_xtop, boxptr->r_ytop);
if (area > 0)
TxPrintf(" %-10"DLONG_PREFIX"d", area);
TxPrintf(" %-10lld", area);
TxPrintf("\n");
break;

View File

@ -48,9 +48,9 @@
*/
void
CmdAutoExtToSim(
MagWindow *w,
TxCommand *cmd)
CmdAutoExtToSim(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
int result;
@ -83,9 +83,9 @@ CmdAutoExtToSim(
*/
void
CmdAutoExtToSpice(
MagWindow *w,
TxCommand *cmd)
CmdAutoExtToSpice(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
int result;
@ -119,9 +119,9 @@ CmdAutoExtToSpice(
*/
void
CmdAutoRoute(
MagWindow *w,
TxCommand *cmd)
CmdAutoRoute(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
int result;
@ -154,9 +154,9 @@ CmdAutoRoute(
*/
void
CmdAutoPlot(
MagWindow *w,
TxCommand *cmd)
CmdAutoPlot(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
int result;
@ -189,9 +189,9 @@ CmdAutoPlot(
*/
void
CmdAutoLef(
MagWindow *w,
TxCommand *cmd)
CmdAutoLef(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
int result;

File diff suppressed because it is too large Load Diff

View File

@ -17,7 +17,7 @@
*/
#ifndef lint
static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/commands/CmdE.c,v 1.4 2010/06/17 14:38:33 tim Exp $";
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/commands/CmdE.c,v 1.4 2010/06/17 14:38:33 tim Exp $";
#endif /* not lint */
#include <stdio.h>
@ -56,12 +56,10 @@ static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magi
*
* Implement the "edit" command.
* Use the cell that is currently selected as the edit cell. If more than
* one cell is selected, use the point to choose between them. If the
* optional argument "<instname>" is provided, then edit the specified
* instance (if it exists in the current layout window).
* one cell is selected, use the point to choose between them.
*
* Usage:
* edit [<instname>]
* edit
*
* Results:
* None.
@ -79,29 +77,18 @@ static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magi
static bool cmdFoundNewEdit;
void
CmdEdit(
MagWindow *w,
TxCommand *cmd)
CmdEdit(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
Rect area, pointArea;
CellUse *usave, *use = NULL;
CellUse *usave;
CellDef *csave;
int cmdEditRedisplayFunc(MagWindow *w, Rect *area); /* Forward declaration. */
int cmdEditEnumFunc(CellUse *selUse, CellUse *use, Transform *transform, Rect *area); /* Forward declaration. */
int cmdEditRedisplayFunc(); /* Forward declaration. */
int cmdEditEnumFunc(); /* Forward declaration. */
bool noCurrentUse = FALSE;
if ((w != NULL) && (cmd->tx_argc == 2))
{
CellUse *rootUse;
SearchContext scx;
rootUse = (CellUse *)w->w_surfaceID;
bzero(&scx, sizeof(SearchContext));
DBTreeFindUse(cmd->tx_argv[1], rootUse, &scx);
use = scx.scx_use;
}
if ((use == NULL) && (cmd->tx_argc > 1))
if (cmd->tx_argc > 1)
{
TxError("Usage: edit\nMaybe you want the \"load\" command\n");
return;
@ -134,18 +121,10 @@ CmdEdit(
cmdFoundNewEdit = FALSE;
csave = EditRootDef;
usave = EditCellUse;
EditCellUse = NULL;
if (use == NULL)
{
EditCellUse = NULL;
SelEnumCells(FALSE, (bool *) NULL, (SearchContext *) NULL,
cmdEditEnumFunc, (ClientData) &pointArea);
}
else
{
EditCellUse = use;
cmdFoundNewEdit = TRUE;
}
(void) SelEnumCells(FALSE, (bool *) NULL, (SearchContext *) NULL,
cmdEditEnumFunc, (ClientData) &pointArea);
if (EditCellUse == (CellUse *)NULL)
{
@ -155,7 +134,11 @@ CmdEdit(
return;
}
else if (!(EditCellUse->cu_def->cd_flags & CDAVAILABLE))
DBCellRead(EditCellUse->cu_def, TRUE, TRUE, NULL);
{
bool dereference = (EditCellUse->cu_def->cd_flags & CDDEREFERENCE) ?
TRUE : FALSE;
DBCellRead(EditCellUse->cu_def, (char *)NULL, TRUE, dereference, NULL);
}
if (EditCellUse->cu_def->cd_flags & CDNOEDIT)
{
@ -179,14 +162,6 @@ CmdEdit(
GeoTransRect(&EditToRootTransform, &(EditCellUse->cu_def->cd_bbox), &area);
(void) WindSearch(DBWclientID, (ClientData) NULL,
(Rect *) NULL, cmdEditRedisplayFunc, (ClientData) &area);
if ((cmd->tx_argc == 1) && cmdFoundNewEdit)
{
/* Recast the command with the instance name for logging */
sprintf(cmd->tx_argstring, "edit %s", EditCellUse->cu_id);
TxRebuildCommand(cmd);
}
}
/* Search function to handle redisplays for CmdEdit: it checks to
@ -197,11 +172,11 @@ CmdEdit(
*/
int
cmdEditRedisplayFunc(
MagWindow *w, /* Window containing edit cell. */
Rect *area) /* Area to be redisplayed. */
cmdEditRedisplayFunc(w, area)
MagWindow *w; /* Window containing edit cell. */
Rect *area; /* Area to be redisplayed. */
{
static const Rect origin = {{-1, -1}, {1, 1}};
static Rect origin = {-1, -1, 1, 1};
Rect tmp;
DBWclientRec *crec = (DBWclientRec *) w->w_clientData;
@ -226,13 +201,13 @@ cmdEditRedisplayFunc(
*/
int
cmdEditEnumFunc(
CellUse *selUse, /* Use from selection (not used). */
CellUse *use, /* Use from layout that corresponds to
cmdEditEnumFunc(selUse, use, transform, area)
CellUse *selUse; /* Use from selection (not used). */
CellUse *use; /* Use from layout that corresponds to
* selUse (could be an array!).
*/
Transform *transform, /* Transform from use->cu_def to root coords. */
Rect *area) /* We're looking for a use containing this
Transform *transform; /* Transform from use->cu_def to root coords. */
Rect *area; /* We're looking for a use containing this
* area, in root coords.
*/
{
@ -305,20 +280,20 @@ cmdEditEnumFunc(
#define OPTION_FLAGS 3
void
CmdElement(
MagWindow *w,
TxCommand *cmd)
CmdElement(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
int option, type;
const char * const *msg;
char **msg;
Rect area;
int style;
CellDef *def;
CellUse *use;
bool getopt;
static const char * const cmdElementOption[] = {
static char *cmdElementOption[] = {
"add create a new element",
"delete delete an existing element",
"configure configure or query an existing element",
@ -328,14 +303,14 @@ CmdElement(
NULL
};
static const char * const cmdElementType[] = {
static char *cmdElementType[] = {
"line name style x1 y1 x2 y2",
"rectangle name style llx lly urx ury",
"text name style cx cy label",
NULL
};
static const char * const cmdConfigureType[] = {
static char *cmdConfigureType[] = {
"text get (or) replace <string>",
"style get (or) add <style> (or) remove <style>",
"position get (or) <point> (or) <rect>",
@ -606,7 +581,7 @@ badusage:
* EditCellUse->cu_def.
*
* Usage:
* erase [layers | cursor | pick x y]
* erase [layers | cursor]
*
* Results:
* None.
@ -627,34 +602,25 @@ static CellUse *cmdEraseCells[MAXCELLS];
static int cmdEraseCount;
void
CmdErase(
MagWindow *w,
TxCommand *cmd)
CmdErase(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
Rect editRect, areaReturn;
TileTypeBitMask mask, errorLayersForErasure, activeLayersForErasure;
extern int cmdEraseCellsFunc(SearchContext *scx, ClientData cdarg);
extern int cmdEraseCellsFunc();
windCheckOnlyWindow(&w, DBWclientID);
if (w == (MagWindow *) NULL) return;
if ((cmd->tx_argc == 4) && !strcmp(cmd->tx_argv[1], "pick"))
{
Point editPoint, rootPoint;
editPoint.p_x = cmdParseCoord(w, cmd->tx_argv[2], FALSE, TRUE);
editPoint.p_y = cmdParseCoord(w, cmd->tx_argv[3], FALSE, FALSE);
GeoTransPoint(&EditToRootTransform, &editPoint, &rootPoint);
CmdPaintEraseButton(w, &rootPoint, FALSE, FALSE);
return;
}
if (cmd->tx_argc > 2)
{
TxError("Usage: %s [<layers> | cursor | pick x y]\n", cmd->tx_argv[0]);
TxError("Usage: %s [<layers> | cursor]\n", cmd->tx_argv[0]);
return;
}
if (!ToolGetEditBox(&editRect)) return;
if (EditCellUse == NULL)
{
TxError("No cell def being edited!\n");
@ -671,16 +637,7 @@ CmdErase(
(void) CmdParseLayers("*,label", &mask);
else if (!strncmp(cmd->tx_argv[1], "cursor", 6))
{
Point editPoint, rootPoint;
CmdPaintEraseButton(w, &cmd->tx_p, FALSE, TRUE);
/* Recast the command as "erase pick x y" for logging purposes */
CmdGetRootPoint(&rootPoint, (Rect *)NULL);
GeoTransPoint(&RootToEditTransform, &rootPoint, &editPoint);
sprintf(cmd->tx_argstring, "erase pick %di %di", editPoint.p_x,
editPoint.p_y);
TxRebuildCommand(cmd);
CmdPaintEraseButton(w, &cmd->tx_p, FALSE);
return;
}
else if (!CmdParseLayers(cmd->tx_argv[1], &mask))
@ -759,9 +716,9 @@ CmdErase(
}
int
cmdEraseCellsFunc(
SearchContext *scx, /* Indicates cell found. */
ClientData cdarg) /* Not used. */
cmdEraseCellsFunc(scx, cdarg)
SearchContext *scx; /* Indicates cell found. */
ClientData cdarg; /* Not used. */
{
/* All this procedure does is to remember cells that are
* found, up to MAXCELLS of them.
@ -781,82 +738,39 @@ cmdEraseCellsFunc(
* Implement the "expand" command.
*
* Usage:
* expand [selection|surround|overlap|all] [toggle]
*
* "selection" expands cells in the selection. All other options
* expand cells in the layout. "all" expands all cells in the
* layout. "surround" expands cells which the cursor box
* surrounds completely, and "overlap" expands cells which the
* cursor box overlaps.
*
* If "toggle" is specified, flips the expanded/unexpanded status.
* Cells which were expanded are unexpanded, and cells which were
* unexpanded are expanded.
*
* For backwards compatibility:
* "expand" alone implements "expand overlap".
* "expand toggle" implements "expand selection toggle".
*
* Also see: CmdUnexpand
* expand
* expand toggle
*
* Results:
* None.
*
* Side effects:
* Expansion state of cells is changed. May read cells in from
* disk, and update bounding boxes that have changed.
* If "toggle" is specified, flips the expanded/unexpanded status
* of all selected cells. Otherwise, aren't any unexpanded cells
* left under the box. May read cells in from disk, and updates
* bounding boxes that have changed.
*
* ----------------------------------------------------------------------------
*/
#define EXPAND_SELECTION 0
#define EXPAND_SURROUND 1
#define EXPAND_OVERLAP 2
#define EXPAND_ALL 3
#define EXPAND_HELP 4
void
CmdExpand(
MagWindow *w,
TxCommand *cmd)
CmdExpand(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
int windowMask, boxMask, d, option;
bool doToggle = FALSE;
const char * const *msg;
int windowMask, boxMask, d;
Rect rootRect;
CellUse *rootBoxUse;
CellDef *rootBoxDef;
int cmdExpandFunc(); /* Forward reference. */
int cmdExpandFunc(CellUse *use, int windowMask); /* Forward reference. */
static const char * const cmdExpandOption[] = {
"selection expand cell instances in the selection",
"surround expand cell instances which the cursor box surrounds",
"overlap expand cell instances which the cursor box overlaps",
"all expand all cell instances",
NULL
};
if (cmd->tx_argc > 1)
if (cmd->tx_argc > 2 || (cmd->tx_argc == 2
&& (strncmp(cmd->tx_argv[1], "toggle", strlen(cmd->tx_argv[1])) != 0)))
{
if (!strncmp(cmd->tx_argv[cmd->tx_argc - 1], "toggle",
strlen(cmd->tx_argv[cmd->tx_argc - 1])))
{
doToggle = TRUE;
cmd->tx_argc--;
}
TxError("Usage: %s or %s toggle\n", cmd->tx_argv[0], cmd->tx_argv[0]);
return;
}
if (cmd->tx_argc > 1)
{
option = Lookup(cmd->tx_argv[1], cmdExpandOption);
if (option < 0) option = EXPAND_HELP;
}
else
option = EXPAND_OVERLAP;
if (option == EXPAND_HELP) goto badusage;
windCheckOnlyWindow(&w, DBWclientID);
if (w == (MagWindow *) NULL)
{
@ -887,95 +801,23 @@ CmdExpand(
WindScale(d, 1);
TxPrintf("expand: rescaled by %d\n", d);
d = DBLambda[1];
if (doToggle) break; /* Don't toggle twice */
if (cmd->tx_argc == 2) break; /* Don't toggle twice */
}
(void) ToolGetBoxWindow(&rootRect, &boxMask);
if (option != EXPAND_SELECTION)
if (cmd->tx_argc == 2)
SelectExpand(windowMask);
else
{
if ((boxMask & windowMask) != windowMask)
{
TxError("The box isn't in the same window as the cursor.\n");
return;
}
}
switch (option)
{
case EXPAND_SELECTION:
SelectExpand(windowMask,
(doToggle) ? DB_EXPAND_TOGGLE : DB_EXPAND,
(Rect *)NULL);
break;
case EXPAND_OVERLAP:
if (doToggle)
{
DBExpandAll(rootBoxUse, &rootRect, windowMask,
DB_EXPAND_TOGGLE | DB_EXPAND_OVERLAP,
cmdExpandFunc, (ClientData)(pointertype)windowMask);
SelectExpand(windowMask,
DB_EXPAND_TOGGLE | DB_EXPAND_OVERLAP,
&rootRect);
}
else
{
DBExpandAll(rootBoxUse, &rootRect, windowMask,
DB_EXPAND | DB_EXPAND_OVERLAP,
cmdExpandFunc, (ClientData)(pointertype)windowMask);
SelectExpand(windowMask,
DB_EXPAND | DB_EXPAND_OVERLAP,
&rootRect);
}
break;
case EXPAND_SURROUND:
if (doToggle)
{
DBExpandAll(rootBoxUse, &rootRect, windowMask,
DB_EXPAND_TOGGLE | DB_EXPAND_SURROUND,
cmdExpandFunc, (ClientData)(pointertype)windowMask);
SelectExpand(windowMask,
DB_EXPAND_TOGGLE | DB_EXPAND_SURROUND,
&rootRect);
}
else
{
DBExpandAll(rootBoxUse, &rootRect, windowMask,
DB_EXPAND | DB_EXPAND_SURROUND,
cmdExpandFunc, (ClientData)(pointertype)windowMask);
SelectExpand(windowMask,
DB_EXPAND | DB_EXPAND_SURROUND,
&rootRect);
}
break;
case EXPAND_ALL:
if (doToggle)
{
DBExpandAll(rootBoxUse, &TiPlaneRect, windowMask,
DB_EXPAND | DB_EXPAND_OVERLAP,
cmdExpandFunc, (ClientData)(pointertype)windowMask);
SelectExpand(windowMask,
DB_EXPAND | DB_EXPAND_OVERLAP,
(Rect *)NULL);
}
else
{
DBExpandAll(rootBoxUse, &TiPlaneRect, windowMask,
DB_EXPAND | DB_EXPAND_OVERLAP,
cmdExpandFunc, (ClientData)(pointertype)windowMask);
SelectExpand(windowMask,
DB_EXPAND | DB_EXPAND_OVERLAP,
(Rect *)NULL);
}
break;
DBExpandAll(rootBoxUse, &rootRect, windowMask,
TRUE, cmdExpandFunc, (ClientData)(pointertype) windowMask);
}
} while (d != DBLambda[1]);
return;
badusage:
for (msg = &(cmdExpandOption[0]); *msg != NULL; msg++)
TxPrintf(" %s\n", *msg);
TxPrintf(" toggle Toggle the visibility of cell instances.\n");
}
/* This function is called for each cell whose expansion status changed.
@ -984,9 +826,9 @@ badusage:
*/
int
cmdExpandFunc(
CellUse *use, /* Use that was just expanded. */
int windowMask) /* Window where it was expanded. */
cmdExpandFunc(use, windowMask)
CellUse *use; /* Use that was just expanded. */
int windowMask; /* Window where it was expanded. */
{
if (use->cu_parent == NULL) return 0;
DBWAreaChanged(use->cu_parent, &use->cu_bbox, windowMask,
@ -1024,12 +866,10 @@ cmdExpandFunc(
#define EXTLENGTH 5
#define EXTNO 6
#define EXTPARENTS 7
#define EXTPATH 8
#define EXTSHOWPARENTS 9
#define EXTSTEPSIZE 10
#define EXTSTYLE 11
#define EXTUNIQUE 12
#define EXTWARN 13
#define EXTSHOWPARENTS 8
#define EXTSTYLE 9
#define EXTUNIQUE 10
#define EXTWARN 11
#define WARNALL 0
#define WARNDUP 1
@ -1040,14 +880,11 @@ cmdExpandFunc(
#define DOALL 1
#define DOCAPACITANCE 2
#define DOCOUPLING 3
#define DOEXTRESIST 4
#define DOLENGTH 5
#define DOLOCAL 6
#define DORESISTANCE 7
#define DOLABELCHECK 8
#define DOALIASES 9
#define DOUNIQUE 10
#define DOEXTRESIST2 11
#define DOLENGTH 4
#define DOLOCAL 5
#define DORESISTANCE 6
#define DOLABELCHECK 7
#define DOALIASES 8
#define LENCLEAR 0
#define LENDRIVER 1
@ -1059,12 +896,11 @@ cmdExpandFunc(
#define UNIQNOTOPPORTS 3
void
CmdExtract(
MagWindow *w,
TxCommand *cmd)
CmdExtract(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
const char * const *msg;
char *namep, *arg;
char **msg, *namep, *arg;
int option, warn, len, n, all;
int dist;
bool no;
@ -1076,7 +912,7 @@ CmdExtract(
int argc = cmd->tx_argc;
char **argv = cmd->tx_argv;
static const char * const cmdExtWarn[] =
static char *cmdExtWarn[] =
{
"all enable all warnings",
"dup warn when different nodes have the same name",
@ -1084,23 +920,20 @@ CmdExtract(
"labels warn when subcell nodes are unlabelled",
NULL
};
static const char * const cmdExtOption[] =
static char *cmdExtOption[] =
{
"adjust compensate R and C hierarchically",
"all all options",
"capacitance extract substrate capacitance",
"coupling extract coupling capacitance",
"extresist extract resistance",
"length compute driver-receiver pathlengths",
"local put all generated files in the current directory",
"lumped estimate lumped resistance",
"resistance estimate resistance",
"labelcheck check for connections through sticky labels",
"aliases output all net name aliases",
"unique [notopports] ensure unique node names during extraction",
"resistance extract resistance (same as \"do extresist\")",
NULL
};
static const char * const cmdExtLength[] =
static char *cmdExtLength[] =
{
"clear clear the driver and receiver tables",
"driver termName(s) identify a driving (output) terminal",
@ -1110,7 +943,7 @@ CmdExtract(
/* These must match definitions EXT_UNIQ_* in extract/extract.h: */
static const char * const cmdExtUniq[] =
static char *cmdExtUniq[] =
{
"all extract matching labels as unique nodes",
"# extract tagged labels as unique nodes",
@ -1118,7 +951,7 @@ CmdExtract(
"notopports ignore top-level ports when making labels unique",
NULL
};
static const char * const cmdExtCmd[] =
static char *cmdExtCmd[] =
{
"all extract root cell and all its children",
"cell name extract selected cell into file \"name\"",
@ -1128,9 +961,7 @@ CmdExtract(
"length [option] control pathlength extraction information",
"no [option] disable extractor option",
"parents extract selected cell and all its parents",
"path [path] if set, extract into the indicated path",
"showparents show all parents of selected cell",
"stepsize [value] print or set the extraction step size",
"style [stylename] set current extraction parameter style",
"unique [option] generate unique names when different nodes\n\
have the same name",
@ -1241,13 +1072,12 @@ CmdExtract(
}
else if (argc == 2)
{
char *halodisp;
halodisp = DBWPrintValue(ExtCurStyle->exts_sideCoupleHalo,
w, TRUE);
#ifdef MAGIC_WRAPPER
Tcl_SetObjResult(magicinterp, Tcl_NewStringObj(halodisp, -1));
Tcl_Obj *tobj;
tobj = Tcl_NewIntObj(ExtCurStyle->exts_sideCoupleHalo);
Tcl_SetObjResult(magicinterp, tobj);
#else
TxPrintf("Side overlap halo is %s\n", halodisp);
TxPrintf("Side overlap halo is %d\n", ExtCurStyle->exts_sideCoupleHalo);
#endif
return;
}
@ -1264,36 +1094,6 @@ CmdExtract(
ExtCurStyle->exts_sideCoupleHalo = dist;
break;
case EXTSTEPSIZE:
if (ExtCurStyle == NULL)
{
TxError("No extraction style set.\n");
return;
}
else if (argc == 2)
{
char *stepdisp;
stepdisp = DBWPrintValue(ExtCurStyle->exts_stepSize, w, TRUE);
#ifdef MAGIC_WRAPPER
Tcl_SetObjResult(magicinterp, Tcl_NewStringObj(stepdisp, -1));
#else
TxPrintf("Extraction step size is %s\n", stepdisp);
#endif
return;
}
else if (argc != 3) goto wrongNumArgs;
/* argv[2] is a step size */
dist = cmdParseCoord(w, argv[2], TRUE, TRUE);
if (dist <= 0)
{
TxError("Bad step size. Step size must be strictly positive.");
return;
}
else
ExtCurStyle->exts_stepSize = dist;
break;
case EXTPARENTS:
selectedUse = CmdGetSelectedCell((Transform *) NULL);
if (selectedUse == NULL)
@ -1317,13 +1117,6 @@ CmdExtract(
ExtShowParents(selectedUse);
return;
case EXTPATH:
if (argc == 2)
ExtPrintPath(dolist);
else
ExtSetPath(argv[2]);
return;
case EXTSTYLE:
if (argc == 2)
ExtPrintStyle(dolist, doforall, !doforall);
@ -1399,12 +1192,10 @@ CmdExtract(
TxPrintf("%s capacitance\n", OPTSET(EXT_DOCAPACITANCE));
TxPrintf("%s coupling\n", OPTSET(EXT_DOCOUPLING));
TxPrintf("%s length\n", OPTSET(EXT_DOLENGTH));
TxPrintf("%s lumped R\n", OPTSET(EXT_DORESISTANCE));
TxPrintf("%s local\n", OPTSET(EXT_DOLOCAL));
TxPrintf("%s resistance\n", OPTSET(EXT_DORESISTANCE));
TxPrintf("%s label check\n", OPTSET(EXT_DOLABELCHECK));
TxPrintf("%s aliases\n", OPTSET(EXT_DOALIASES));
TxPrintf("%s unique\n", OPTSET(EXT_DOUNIQUE));
TxPrintf("%s unique notopports\n", OPTSET(EXT_DOUNIQNOTOPPORTS));
TxPrintf("%s resistance (extresist)\n", OPTSET(EXT_DOEXTRESIST));
return;
#undef OPTSET
}
@ -1431,32 +1222,10 @@ CmdExtract(
case DOCAPACITANCE: option = EXT_DOCAPACITANCE; break;
case DOCOUPLING: option = EXT_DOCOUPLING; break;
case DOLENGTH: option = EXT_DOLENGTH; break;
case DOLOCAL: option = EXT_DOLOCAL; break;
case DORESISTANCE: option = EXT_DORESISTANCE; break;
case DOLABELCHECK: option = EXT_DOLABELCHECK; break;
case DOALIASES: option = EXT_DOALIASES; break;
case DOEXTRESIST:
case DOEXTRESIST2: option = EXT_DOEXTRESIST; break;
case DOUNIQUE:
if (argc == 4)
{
if (!strncmp(argv[3], "notop", 5))
option = EXT_DOUNIQNOTOPPORTS | EXT_DOUNIQUE;
else
TxError("Usage: extract do unique [notopports]\n");
}
else
option = EXT_DOUNIQUE;
break;
case DOLOCAL:
/* "extract do local" and "extract no local" are kept for
* backwards compatibility, but now effectively implement
* "extract path ." and "extract path none", respectively.
*/
if (no)
StrDup(&ExtLocalPath, NULL);
else
StrDup(&ExtLocalPath, ".");
return;
}
if (no) ExtOptions &= ~option;
else ExtOptions |= option;

View File

@ -17,7 +17,7 @@
*/
#ifndef lint
static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/commands/CmdFI.c,v 1.4 2010/06/24 12:37:15 tim Exp $";
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/commands/CmdFI.c,v 1.4 2010/06/24 12:37:15 tim Exp $";
#endif /* not lint */
#include <stdio.h>
@ -100,19 +100,17 @@ struct cmdFPArg
*/
int
feedPolyFunc(
Tile *tile,
TileType dinfo,
struct cmdFPArg *arg)
feedPolyFunc(tile, arg)
Tile *tile;
struct cmdFPArg *arg;
{
Rect area;
TiToRect(tile, &area);
/* (NOTE: Preserve information about the geometry of a diagonal tile) */
DBWFeedbackAdd(&area, arg->text, arg->def, FEEDMAGNIFY,
arg->style |
((TiGetTypeExact(tile) | dinfo) &
(TT_DIAGONAL | TT_DIRECTION | TT_SIDE)));
(TiGetTypeExact(tile) & (TT_DIAGONAL | TT_DIRECTION | TT_SIDE)));
/* (preserve information about the geometry of a diagonal tile) */
return 0;
}
@ -148,11 +146,11 @@ feedPolyFunc(
#define WHY 6
void
CmdFeedback(
MagWindow *w,
TxCommand *cmd)
CmdFeedback(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
static const char * const cmdFeedbackOptions[] =
static char *cmdFeedbackOptions[] =
{
"add text [style] [points...] create new feedback area over box",
"clear [substring] clear all or selected feedback info",
@ -163,11 +161,11 @@ CmdFeedback(
"why print all feedback messages under box",
NULL
};
static const char * const cmdFeedbackStyleNames[] =
static char *cmdFeedbackStyleNames[] =
{
"dotted", "medium", "outline", "pale", "solid", NULL
};
static const int cmdFeedbackStyles[] =
static int cmdFeedbackStyles[] =
{
STYLE_DOTTEDHIGHLIGHTS, STYLE_MEDIUMHIGHLIGHTS,
STYLE_OUTLINEHIGHLIGHTS, STYLE_PALEHIGHLIGHTS,
@ -178,8 +176,7 @@ CmdFeedback(
*/
int option, i, style, pstart;
Rect box, r;
char *text;
const char * const *msg;
char *text, **msg;
CellDef *rootDef;
HashTable table;
HashEntry *h;
@ -508,16 +505,14 @@ Rect cmdFillRootBox; /* Root coords of box. */
struct cmdFillArea *cmdFillList; /* List of areas to fill. */
void
CmdFill(
MagWindow *w, /* Window in which command was invoked. */
TxCommand *cmd) /* Describes the command that was invoked. */
CmdFill(w, cmd)
MagWindow *w; /* Window in which command was invoked. */
TxCommand *cmd; /* Describes the command that was invoked. */
{
TileTypeBitMask maskBits;
Rect editBox;
SearchContext scx;
/* Forward declaration */
extern int cmdFillFunc(Tile *tile, TileType dinfo, TreeContext *cxp);
extern int cmdFillFunc();
if (cmd->tx_argc < 2 || cmd->tx_argc > 3)
{
@ -585,15 +580,13 @@ CmdFill(
/* Now that we've got all the material, scan over the list
* painting the material and freeing up the entries on the list.
*/
free_magic1_t mm1 = freeMagic1_init();
while (cmdFillList != NULL)
{
DBPaint(EditCellUse->cu_def, &cmdFillList->cfa_area,
cmdFillList->cfa_type);
freeMagic1(&mm1, (char *) cmdFillList);
freeMagic((char *) cmdFillList);
cmdFillList = cmdFillList->cfa_next;
}
freeMagic1_end(&mm1);
SelectClear();
DBAdjustLabels(EditCellUse->cu_def, &editBox);
@ -607,17 +600,12 @@ CmdFill(
* paint here it may mess up the search. Instead, the procedures
* save areas on a list. The list is post-processed to paint the
* areas once the search is finished.
*
* Split tile information is unused because there is no obvious
* meaning to "filling" from a split tile, although probably reasonable
* methods could be worked out.
*/
int
cmdFillFunc(
Tile *tile, /* Tile to fill with. */
TileType dinfo, /* Split tile information (unused) */
TreeContext *cxp) /* Describes state of search. */
cmdFillFunc(tile, cxp)
Tile *tile; /* Tile to fill with. */
TreeContext *cxp; /* Describes state of search. */
{
Rect r1, r2;
struct cmdFillArea *cfa;
@ -670,9 +658,9 @@ cmdFillFunc(
*/
void
CmdFindBox(
MagWindow *w,
TxCommand *cmd)
CmdFindBox(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
CellDef *boxDef;
Rect box;
@ -763,12 +751,11 @@ typedef struct _labsearchrec
} LabSearchRec;
int
cmdFindLabelFunc(
Rect *rect,
char *name,
Label *label,
LabSearchRec *cdarg)
int cmdFindLabelFunc(rect, name, label, cdarg)
Rect *rect;
char *name;
Label *label;
LabSearchRec *cdarg;
{
if (cdarg->lsr_occur == 0)
{
@ -803,9 +790,9 @@ cmdFindLabelFunc(
*/
void
CmdFindLabel(
MagWindow *w,
TxCommand *cmd)
CmdFindLabel(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
CellDef *boxDef;
CellUse *labUse;
@ -814,7 +801,7 @@ CmdFindLabel(
int found, occur, plainargs;
bool doglob = FALSE; /* csh-style glob matching (see utils/match.c) */
LabSearchRec lsr;
int dbListLabels(SearchContext *scx, Label *label, TerminalPath *tpath, ClientData cdarg); /* forward declaration */
int dbListLabels(); /* forward declaration */
plainargs = cmd->tx_argc;
if ((plainargs > 2) && !strncmp(cmd->tx_argv[1], "-glob", 5))
@ -852,7 +839,7 @@ CmdFindLabel(
return;
};
labname = cmd->tx_argv[1 + ((doglob) ? 1 : 0)];
labname = cmd->tx_argv[1 + (doglob) ? 1 : 0];
labUse = EditCellUse;
if (labUse == NULL) labUse = (CellUse *)w->w_surfaceID;
@ -902,11 +889,11 @@ usage:
*/
int
dbListLabels(
SearchContext *scx,
Label *label, /* Pointer to label structure */
TerminalPath *tpath, /* Full pathname of terminal */
ClientData cdarg) /* (unused) */
dbListLabels(scx, label, tpath, cdarg)
SearchContext *scx;
Label *label; /* Pointer to label structure */
TerminalPath *tpath; /* Full pathname of terminal */
ClientData cdarg; /* (unused) */
{
char *n = tpath->tp_next;
char c = *n;
@ -947,16 +934,15 @@ dbListLabels(
*/
void
CmdFlush(
MagWindow *w,
TxCommand *cmd)
CmdFlush(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
CellDef *def;
int action;
static const char * const actionNames[] = { "no", "yes", 0 };
static char *actionNames[] = { "no", "yes", 0 };
char *prompt;
bool dereference = FALSE;
bool noprompt = FALSE; /* no interactive confirm when changed */
if (!strncmp(cmd->tx_argv[cmd->tx_argc - 1], "-deref", 6))
{
@ -964,15 +950,9 @@ CmdFlush(
cmd->tx_argc--;
}
if (!strcmp(cmd->tx_argv[cmd->tx_argc - 1], "-noprompt"))
{
noprompt = TRUE;
cmd->tx_argc--;
}
if (cmd->tx_argc > 2)
{
TxError("Usage: flush [cellname] [-noprompt] [-dereference]\n");
TxError("Usage: flush [cellname] [dereference]\n");
return;
}
@ -993,9 +973,7 @@ CmdFlush(
}
}
bool has_changes = (def->cd_flags & (CDMODIFIED|CDSTAMPSCHANGED|CDBOXESCHANGED)) != 0;
if (!noprompt && has_changes)
if (def->cd_flags & (CDMODIFIED|CDSTAMPSCHANGED|CDBOXESCHANGED))
{
prompt = TxPrintString("Really throw away all changes made"
" to cell %s? ", def->cd_name);
@ -1006,7 +984,7 @@ CmdFlush(
cmdFlushCell(def, dereference);
SelectClear();
TxPrintf("[Flushed%s]\n", has_changes ? " Modifications were Discarded" : "");
TxPrintf("[Flushed]\n");
}
@ -1037,9 +1015,9 @@ CmdFlush(
*/
void
CmdGetcell(
MagWindow *w, /* Window in which command was invoked. */
TxCommand *cmd) /* Describes command arguments. */
CmdGetcell(w, cmd)
MagWindow *w; /* Window in which command was invoked. */
TxCommand *cmd; /* Describes command arguments. */
{
CellUse dummy, *newUse;
Transform editTrans;
@ -1122,9 +1100,9 @@ CmdGetcell(
*/
void
CmdGetnode(
MagWindow *w,
TxCommand *cmd)
CmdGetnode(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
#define TBLSIZE 50
#define STRINGS 0
@ -1219,7 +1197,7 @@ CmdGetnode(
TxError("Put the cursor in a layout window\n");
return;
}
if (is_fast == TRUE)
if( is_fast == TRUE )
{
SimRecomputeSel = TRUE;
SimGetsnode();
@ -1227,8 +1205,7 @@ CmdGetnode(
else
SimGetnode();
if (SimGetnodeAlias) /* "erase" the hash table */
{
if (SimGetnodeAlias) { /* "erase" the hash table */
HashKill(&SimGNAliasTbl);
HashInit(&SimGNAliasTbl, 120, STRINGS);
}
@ -1274,15 +1251,15 @@ badusage:
#define GRID_WHAT 7
void
CmdGrid(
MagWindow *w,
TxCommand *cmd)
CmdGrid(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
int option, locargc;
int xSpacing, ySpacing, xOrig, yOrig, multiple;
DBWclientRec *crec;
char *boxvalues;
static const char * const cmdGridOptions[] =
static char *cmdGridOptions[] =
{
"box [values] report the box representing the user grid",
"help print this message",
@ -1442,9 +1419,9 @@ CmdGrid(
#ifdef USE_READLINE
void
CmdHistory(
MagWindow *w,
TxCommand *cmd)
CmdHistory(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
int i;
HIST_ENTRY *he;
@ -1523,11 +1500,11 @@ CmdHistory(
*/
void
CmdIdentify(
MagWindow *w,
TxCommand *cmd)
CmdIdentify(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
extern int cmdIdFunc(CellUse *selUse, CellUse *use, Transform *transform, char *newId); /* Forward reference. */
extern int cmdIdFunc(); /* Forward reference. */
if (cmd->tx_argc != 2)
{
@ -1552,13 +1529,13 @@ CmdIdentify(
/* ARGSUSED */
int
cmdIdFunc(
CellUse *selUse, /* Use from selection cell. */
CellUse *use, /* Use from layout that corresponds to
cmdIdFunc(selUse, use, transform, newId)
CellUse *selUse; /* Use from selection cell. */
CellUse *use; /* Use from layout that corresponds to
* selUse.
*/
Transform *transform, /* Not used. */
char *newId) /* New id for cell use. */
Transform *transform; /* Not used. */
char *newId; /* New id for cell use. */
{
if (EditCellUse == NULL)
{
@ -1599,12 +1576,12 @@ cmdIdFunc(
}
TileType
CmdFindNetProc(
char *nodename,
CellUse *use,
Rect *rect,
bool warn_not_found,
bool *isvalid)
CmdFindNetProc(nodename, use, rect, warn_not_found, isvalid)
char *nodename;
CellUse *use;
Rect *rect;
bool warn_not_found;
bool *isvalid;
{
char *s,*s2;
SearchContext scx, scx2;
@ -1614,13 +1591,13 @@ CmdFindNetProc(
int pnum, xpos, ypos;
char *xstr, *ystr;
bool locvalid = FALSE, usefound = TRUE;
TileType ttype, dinfo = (TileType)0;
TileType ttype;
scx.scx_use = use;
scx.scx_trans = GeoIdentityTransform;
s = nodename;
trans = GeoIdentityTransform;
while ((s2 = strchr(s, '/')))
while (s2 = strchr(s, '/'))
{
*s2 = '\0';
DBTreeFindUse(s, scx.scx_use, &scx2);
@ -1652,7 +1629,6 @@ CmdFindNetProc(
if ((xstr = strchr(s, '_')) != NULL)
{
char *hashpos;
bool isNeg = FALSE;
/* The characters up to the leading '_' should match one of the */
@ -1696,17 +1672,6 @@ CmdFindNetProc(
}
}
}
/* Format variant used for node regions where a split tile
* occupies the root position of the node but the tile type
* belonging to the node is on the right side of the tile,
* not at the location encoded into the name. An 'x' is
* added before the final hash sign.
*/
hashpos = strrchr(s, '#');
if (hashpos != NULL)
if (*(hashpos - 1) == 'r')
dinfo = TT_DIAGONAL | TT_SIDE;
}
}
@ -1729,23 +1694,17 @@ checklocal:
if (locvalid == TRUE)
{
int findTile(Tile *tile, TileType dinfo, TileAndDinfo *tad);
int findTile();
CellDef *targetdef = use->cu_def;
Plane *plane = targetdef->cd_planes[pnum];
TileAndDinfo tad;
ttype = TT_SPACE; /* revert to space in case of failure */
/* Find the tile type of the tile at the specified point which */
/* exists on the plane pnum. Note that in the case of a split */
/* tile region marked with "x" in the name, it does not work to */
/* call DBSrPainNMArea() because the diagonal position is not */
/* known. findTile() determines the proper type and leaves it */
/* in the tad.tad_dinfo record. */
/* exists on the plane pnum. */
tad.tad_tile = (Tile *)NULL;
tad.tad_dinfo = dinfo;
DBSrPaintArea(NULL, plane, &localrect, &DBAllTypeBits, findTile,
(ClientData) &tad);
ttype = tad.tad_dinfo & TT_LEFTMASK;
(ClientData) &ttype);
}
else
{
@ -1809,11 +1768,11 @@ checklocal:
*/
void
CmdGoto(
MagWindow *w,
TxCommand *cmd)
CmdGoto(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
char *nodename = cmd->tx_argv[1];
char *s, *nodename = cmd->tx_argv[1];
Rect rect;
CellUse *use;
int locargc;
@ -1854,9 +1813,9 @@ CmdGoto(
/* are multiple layers drawn at the indicated point. */
#ifdef MAGIC_WRAPPER
Tcl_SetResult(magicinterp, (char*)DBTypeLongName(ttype), NULL); /* Tcl treats as const */
Tcl_SetResult(magicinterp, DBTypeLongName(ttype), NULL);
#else
TxPrintf("node %s is type %s\n", nodename, DBTypeLongName(ttype));
TxPrintf("node %s is type %s\n", s, DBTypeLongName(ttype));
#endif
}
@ -1867,33 +1826,22 @@ CmdGoto(
*/
int
findTile(
Tile *tile,
TileType dinfo, /* (unused) */
TileAndDinfo *tad)
findTile(tile, rtype)
Tile *tile;
TileType *rtype;
{
TileType ttype;
/* Note that since all types are being searched, a split
* tile would cause the callback to be called twice. But
* this routine will pick the indicated side from the
* "tad" structure and return 1 so it does not get called
* a second time. The "dinfo" value passed is irrelevant.
*/
if (IsSplit(tile))
{
if (tad->tad_dinfo & TT_SIDE)
if (SplitSide(tile))
ttype = SplitRightType(tile);
else
ttype = SplitLeftType(tile);
}
else
ttype = TiGetTypeExact(tile);
/* Leave the tile type in tad_dinfo before returning */
tad->tad_dinfo = ttype;
*rtype = ttype;
return 1; /* stop search */
}
@ -1903,13 +1851,13 @@ findTile(
*/
void
FlatCopyAllLabels(
SearchContext *scx,
TileTypeBitMask *mask,
int xMask,
CellUse *targetUse)
FlatCopyAllLabels(scx, mask, xMask, targetUse)
SearchContext *scx;
TileTypeBitMask *mask;
int xMask;
CellUse *targetUse;
{
int flatCopyAllLabels(SearchContext *scx, Label *lab, TerminalPath *tpath, CellUse *targetUse);
int flatCopyAllLabels();
char pathstring[FLATTERMSIZE];
TerminalPath tpath;
@ -1922,17 +1870,18 @@ FlatCopyAllLabels(
}
int
flatCopyAllLabels(
SearchContext *scx,
Label *lab,
TerminalPath *tpath,
CellUse *targetUse)
flatCopyAllLabels(scx, lab, tpath, targetUse)
SearchContext *scx;
Label *lab;
TerminalPath *tpath;
CellUse *targetUse;
{
Rect labTargetRect;
int targetPos;
unsigned short flags = 0;
unsigned int port = 0;
CellDef *def;
char labelname[1024];
char *n, *f, c;
/* Ignore null labels */
@ -2005,9 +1954,9 @@ flatCopyAllLabels(
*/
void
CmdFlatten(
MagWindow *w,
TxCommand *cmd)
CmdFlatten(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
int i, xMask, optargs;
bool dolabels, dobox, toplabels, invert, doports, doinplace;
@ -2102,7 +2051,7 @@ CmdFlatten(
}
use = (CellUse *)HashGetValue(he);
UndoDisable();
DBFlattenInPlace(use, EditCellUse, xMask, dolabels, toplabels, TRUE);
DBFlattenInPlace(use, EditCellUse, xMask, dolabels, toplabels);
UndoEnable();
}
else
@ -2114,12 +2063,8 @@ CmdFlatten(
scx.scx_trans = SelectUse->cu_transform;
DBCellFlattenAllCells(&scx, EditCellUse, xMask, dolabels, toplabels);
/* Instances in SelectDef need to be removed. The 2nd */
/* argument TRUE causes the selection to be deleted. */
SelectDeleteUses("flattened", TRUE);
UndoEnable();
SelectClear();
}
return;
}
@ -2178,16 +2123,15 @@ CmdFlatten(
DBCellCopyAllPaint(&scx, &DBAllButSpaceAndDRCBits, xMask, flatDestUse);
DBFlatCopyMaskHints(&scx, xMask, flatDestUse);
if (toplabels)
if (dolabels)
FlatCopyAllLabels(&scx, &DBAllTypeBits, xMask, flatDestUse);
else if (toplabels)
{
int savemask = scx.scx_use->cu_expandMask;
scx.scx_use->cu_expandMask = CU_DESCEND_SPECIAL;
DBCellCopyAllLabels(&scx, &DBAllTypeBits, CU_DESCEND_SPECIAL, flatDestUse,
NULL);
DBCellCopyAllLabels(&scx, &DBAllTypeBits, CU_DESCEND_SPECIAL, flatDestUse);
scx.scx_use->cu_expandMask = savemask;
}
else if (dolabels)
FlatCopyAllLabels(&scx, &DBAllTypeBits, xMask, flatDestUse);
if (xMask != CU_DESCEND_ALL)
DBCellCopyAllCells(&scx, xMask, flatDestUse, (Rect *)NULL);

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -18,7 +18,7 @@
*/
#ifndef lint
static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/commands/CmdSubrs.c,v 1.2 2010/06/24 12:37:15 tim Exp $";
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/commands/CmdSubrs.c,v 1.2 2010/06/24 12:37:15 tim Exp $";
#endif /* not lint */
#include <stdio.h>
@ -52,9 +52,9 @@ static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magi
/* Forward declarations */
extern char *cmdCheckNewName(CellDef *def, char *newName, bool tryRename, bool noninteractive);
extern int cmdSaveWindSet(MagWindow *window, CellDef *def);
extern void CmdSetWindCaption(CellUse *newEditUse, CellDef *rootDef);
extern char *cmdCheckNewName();
extern int cmdSaveWindSet();
extern void CmdSetWindCaption();
TileTypeBitMask CmdYMLabel;
TileTypeBitMask CmdYMCell;
@ -73,22 +73,9 @@ TileTypeBitMask CmdYMAllButSpace;
* lambda, a suffix of "g" indicates the user grid, and a suffix in metric
* notation ("nm", "um", "mm", "cm") indicates natural units. Other valid
* units are "cu" or "centimicrons" for centimicrons, or "microns" for um.
* Traditional (backwards-compatible) behavior: Units without any suffix
* are assumed to be in lambda if "snap" (DBWSnapToGrid) is set to lambda,
* grid units if "snap" is set to the user grid, and internal units otherwise.
* Current behavior: Use of the "units" command to set the units to
* any value other than "default" causes cmdScaleCoord() to parse any
* units provided without an identifying suffix as the units indicted by
* the "units" command. Once the "units" command has been issued, the
* values are dependent on DBWUnits and not on DBWSnapToGrid.
*
* Additional behavior from magic version 8.3.596: A single command
* option can use simple expressions using '+', '-', '*', and '/'. These
* can be passed as a single token, without spaces, or within a string
* token deliniated by quotes or braces, per usual Tcl syntax. Unlike
* the Tcl "expr" command, this can solve arithmetic expressions of
* suffixed values, evaluated independently such that different suffixes
* may be used (e.g., "1g + 3um" meaning 1 grid pitch plus 3 microns).
* Units without any suffix are assumed to be in lambda if "snap"
* (DBWSnapToGrid) is set to lambda, grid units if "snap" is set to the
* user grid, and internal units otherwise.
*
* MagWindow argument w is used only with grid-based snapping, to find
* the value of the grid for the given window. In this case, because the
@ -112,212 +99,111 @@ TileTypeBitMask CmdYMAllButSpace;
* ----------------------------------------------------------------------------
*/
#define PARSEOP_NONE 0
#define PARSEOP_ADD 1
#define PARSEOP_SUB 2
#define PARSEOP_MUL 3
#define PARSEOP_DIV 4
#define PARSEOP_END 5
int
cmdScaleCoord(
MagWindow *w,
char *arg,
bool is_relative,
bool is_x,
int scale)
cmdScaleCoord(w, arg, is_relative, is_x, scale)
MagWindow *w;
char *arg;
bool is_relative, is_x;
int scale;
{
char *endptr;
double dval = 0;
int mscale = 1, curunits;
int retval, curval, parseop;
int mscale = 1;
DBWclientRec *crec;
if (*arg == '{' || *arg == '"') arg++;
while (isspace(*arg) && (*arg != '\0')) arg++;
if (*arg == '{') arg++;
while (isspace(*arg)) arg++;
parseop = PARSEOP_NONE;
retval = 0;
while (*arg != '\0')
dval = strtod(arg, &endptr);
dval *= (double)scale;
if (endptr == arg)
{
dval = strtod(arg, &endptr);
dval *= (double)scale;
mscale = -1;
/* strtod() error condition */
TxError("Coordinate value cannot be parsed: assuming 0\n");
return 0;
}
if (endptr == arg)
else if ((*endptr == 'l')
|| ((*endptr == '\0') && (DBWSnapToGrid == DBW_SNAP_LAMBDA)))
{
/* lambda or default units */
dval *= (double)DBLambda[1];
dval /= (double)DBLambda[0];
return round(dval);
}
else if ((*endptr == 'i')
|| ((*endptr == '\0') && (DBWSnapToGrid == DBW_SNAP_INTERNAL)))
{
/* internal units */
return round(dval);
}
else if ((*endptr == 'g')
|| ((*endptr == '\0') && (DBWSnapToGrid == DBW_SNAP_USER)))
{
/* grid units */
if (w == (MagWindow *)NULL)
{
/* strtod() error condition */
TxError("Coordinate value cannot be parsed: assuming 0\n");
curval = 0;
break;
}
/* Original behavior was to accept un-suffixed values according to the
* "snap" setting. This behavior remains in effect until the "units"
* command is used, in which case units follow the selected units
* value indepedendently of the snap setting.
*
* Updated 12/24/2026 to handle space-separated values (in which
* *endptr may be a space as well as NULL).
*/
if (DBWUnits == DBW_UNITS_DEFAULT)
curunits = DBWSnapToGrid;
else
curunits = DBWUnits & DBW_UNITS_TYPE_MASK;
if ((*endptr == 'l')
|| (((*endptr == '\0') || isspace(*endptr))
&& (curunits == DBW_UNITS_LAMBDA)))
{
/* lambda or default units */
dval *= (double)DBLambda[1];
dval /= (double)DBLambda[0];
}
else if ((*endptr == 'i')
|| (((*endptr == '\0') || isspace(*endptr))
&& (curunits == DBW_UNITS_INTERNAL)))
{
/* internal units */
}
else if ((*endptr == 'g')
|| (((*endptr == '\0') || isspace(*endptr))
&& (curunits == DBW_UNITS_USER)))
{
/* grid units */
windCheckOnlyWindow(&w, DBWclientID);
if (w == (MagWindow *)NULL)
{
windCheckOnlyWindow(&w, DBWclientID);
if (w == (MagWindow *)NULL)
{
curval = round(dval); /* Default, if window is unknown */
break;
}
}
crec = (DBWclientRec *) w->w_clientData;
if (is_x)
{
dval *= (double)(crec->dbw_gridRect.r_xtop
return round(dval); /* Default, if window is unknown */
}
crec = (DBWclientRec *) w->w_clientData;
if (is_x)
{
dval *= (double)(crec->dbw_gridRect.r_xtop
- crec->dbw_gridRect.r_xbot);
if (!is_relative)
dval += (double)crec->dbw_gridRect.r_xbot;
}
else
{
dval *= (double)(crec->dbw_gridRect.r_ytop
if (!is_relative)
dval += (double)crec->dbw_gridRect.r_xbot;
}
else
{
dval *= (double)(crec->dbw_gridRect.r_ytop
- crec->dbw_gridRect.r_ybot);
if (!is_relative)
dval += (double)crec->dbw_gridRect.r_ybot;
}
if (!is_relative)
dval += (double)crec->dbw_gridRect.r_ybot;
}
else if (((*endptr == '\0') || isspace(*endptr))
&& (curunits == DBW_UNITS_MICRONS))
{
mscale = 1000;
}
else if (*endptr != '\0')
{
/* natural units referred to the current cifoutput style */
if (*(endptr + 1) == 'm')
{
switch (*endptr)
{
case 'n':
mscale = 1;
break;
case 'u':
mscale = 1000;
break;
case 'm':
mscale = 1000000;
break;
case 'c':
mscale = 10000000;
break;
default:
TxError("Unknown metric prefix \"%cm\"; assuming "
"internal units\n", *endptr);
mscale = -1;
}
}
else if ((*endptr == 'u') && !isalnum(*(endptr + 1)))
/* Maybe "u" is too ambiguous but it is very commonly used as
* an abbreviation for "micron".
*/
mscale = 1000;
else if (!strncmp(endptr, "micron", 6))
mscale = 1000;
else if (!strncmp(endptr, "centimicron", 11) || !strcmp(endptr, "cu"))
mscale = 10;
else if (!isspace(*endptr) && (*endptr != '+') && (*endptr != '-') &&
(*endptr != '*') && (*endptr != '/'))
{
TxError("Unknown coordinate type at \"%s\"; assuming internal units\n",
endptr);
mscale = -1;
}
}
if (mscale != -1)
dval /= CIFGetOutputScale(mscale);
curval = round(dval);
switch (parseop)
{
case PARSEOP_NONE:
retval = curval;
break;
case PARSEOP_ADD:
retval += curval;
break;
case PARSEOP_SUB:
retval -= curval;
break;
case PARSEOP_MUL:
retval *= curval;
break;
case PARSEOP_DIV:
retval /= curval;
break;
}
parseop = PARSEOP_NONE;
while (*endptr != '\0')
return round(dval);
}
else
{
/* natural units referred to the current cifoutput style */
if (*(endptr + 1) == 'm')
{
switch (*endptr)
{
case '}':
case '"':
parseop = PARSEOP_END;
case 'n':
mscale = 1;
break;
case '+':
parseop = PARSEOP_ADD;
endptr++;
case 'u':
mscale = 1000;
break;
case '-':
parseop = PARSEOP_SUB;
endptr++;
case 'm':
mscale = 1000000;
break;
case '*':
parseop = PARSEOP_MUL;
endptr++;
break;
case '/':
parseop = PARSEOP_DIV;
endptr++;
break;
case ' ':
case '\t':
endptr++;
case 'c':
mscale = 10000000;
break;
default:
/* Should this flag an error? */
return retval;
TxError("Unknown metric prefix \"%cm\"; assuming internal units\n",
*endptr);
return round(dval);
}
if (parseop != PARSEOP_NONE) break;
}
arg = endptr;
while (isspace(*arg) && (*arg != '\0')) arg++;
else if (!strncmp(endptr, "micron", 6))
mscale = 1000;
else if (!strncmp(endptr, "centimicron", 11) || !strcmp(endptr, "cu"))
mscale = 10;
else if (!isspace(*endptr))
{
TxError("Unknown coordinate type \"%s\"; assuming internal units\n",
endptr);
return round(dval);
}
}
return retval;
if (!isspace(*endptr))
dval /= CIFGetOutputScale(mscale);
return round(dval);
}
/*
@ -339,11 +225,10 @@ cmdScaleCoord(
*/
int
cmdParseCoord(
MagWindow *w,
char *arg,
bool is_relative,
bool is_x)
cmdParseCoord(w, arg, is_relative, is_x)
MagWindow *w;
char *arg;
bool is_relative, is_x;
{
return cmdScaleCoord(w, arg, is_relative, is_x, 1);
}
@ -367,7 +252,7 @@ cmdParseCoord(
*/
void
CmdInit(void)
CmdInit()
{
TTMaskZero(&CmdYMLabel);
TTMaskSetType(&CmdYMLabel, L_LABEL);
@ -401,11 +286,12 @@ CmdInit(void)
*/
void
cmdFlushCell(
CellDef *def,
bool force_deref)
cmdFlushCell(def, force_deref)
CellDef *def;
bool force_deref;
{
CellUse *parentUse;
bool dereference;
if (def == NULL) return;
@ -438,7 +324,8 @@ cmdFlushCell(
}
DBCellClearDef(def);
DBCellClearAvail(def);
(void) DBCellRead(def, TRUE, TRUE, NULL);
dereference = (def->cd_flags & CDDEREFERENCE) ? TRUE : FALSE;
(void) DBCellRead(def, (char *) NULL, TRUE, dereference, NULL);
DBCellSetAvail(def);
DBReComputeBbox(def);
DBCellSetModified(def, FALSE);
@ -483,9 +370,9 @@ cmdFlushCell(
*/
bool
CmdParseLayers(
char *s,
TileTypeBitMask *mask)
CmdParseLayers(s, mask)
char *s;
TileTypeBitMask *mask;
{
TileTypeBitMask newmask, tempmask;
char *dp, c;
@ -504,23 +391,23 @@ CmdParseLayers(
#define LN_CONNECT 5
static struct
{
const char *layer_name;
char *layer_name;
int layer_value;
}
const special[] =
special[] =
{
{"$", LN_DOLLAR},
{"*", LN_ALL},
{"errors", LN_ERRORS},
{"labels", LN_LABELS},
{"subcell", LN_CELL},
{"connect", LN_CONNECT},
{0},
"$", LN_DOLLAR,
"*", LN_ALL,
"errors", LN_ERRORS,
"labels", LN_LABELS,
"subcell", LN_CELL,
"connect", LN_CONNECT,
0,
};
TTMaskZero(mask);
while ((c = *s++))
while (c = *s++)
{
switch (c)
{
@ -547,7 +434,7 @@ CmdParseLayers(
type = DBTechNameTypes(name, &newmask);
if (type == -2)
{
which = LookupStruct(name, (const LookupTable *) special, sizeof special[0]);
which = LookupStruct(name, (LookupTable *) special, sizeof special[0]);
if (which >= 0)
{
switch (special[which].layer_value)
@ -657,8 +544,8 @@ printTypes:
*/
TileType
cmdMaskToType(
TileTypeBitMask *mask)
cmdMaskToType(mask)
TileTypeBitMask *mask;
{
TileType type, t;
@ -703,16 +590,16 @@ cmdMaskToType(
*/
void
cmdSaveCell(
CellDef *cellDef, /* Pointer to def of cell to be saved */
char *newName, /* Pointer to name of file in which cell is to be
cmdSaveCell(cellDef, newName, noninteractive, tryRename)
CellDef *cellDef; /* Pointer to def of cell to be saved */
char *newName; /* Pointer to name of file in which cell is to be
* saved. May be NULL, in which case the name from
* the CellDef is taken.
*/
bool noninteractive,/* If true, try hard but don't ask the user
bool noninteractive;/* If true, try hard but don't ask the user
* questions.
*/
bool tryRename) /* We should rename the cell to the name of the
bool tryRename; /* We should rename the cell to the name of the
* place where it was saved.
*/
{
@ -761,16 +648,13 @@ cmdSaveCell(
if (!tryRename || (fileName == NULL) || (strcmp(cellDef->cd_name, fileName) == 0))
goto cleanup;
/* Rename the cell, unless fileName is a .tcl file (scripted output) */
if ((strlen(fileName) <= 4) || strcmp(fileName + strlen(fileName) - 4, ".tcl"))
/* Rename the cell */
if (!DBCellRenameDef(cellDef, fileName))
{
if (!DBCellRenameDef(cellDef, fileName))
{
/* This should never happen */
TxError("Magic error: there is already a cell named \"%s\"\n",
/* This should never happen */
TxError("Magic error: there is already a cell named \"%s\"\n",
fileName);
goto cleanup;
}
goto cleanup;
}
if (EditCellUse && (cellDef == EditCellUse->cu_def))
@ -825,13 +709,13 @@ cleanup:
*/
char *
cmdCheckNewName(
CellDef *def,
char *newName,
bool tryRename,
bool noninteractive)
cmdCheckNewName(def, newName, tryRename, noninteractive)
CellDef *def;
char *newName;
bool tryRename;
bool noninteractive;
{
static const char * const yesno[] = { "no", "yes", 0 };
static char *yesno[] = { "no", "yes", 0 };
char *filename;
char *prompt;
char *returnname;
@ -869,7 +753,7 @@ again:
if (strcmp(returnname, def->cd_name) != 0)
{
if ((f = PaOpen(returnname, "r", DBSuffix, ".", (char *) NULL, &filename)))
if (f = PaOpen(returnname, "r", DBSuffix, ".", (char *) NULL, &filename))
{
(void) fclose(f);
if (noninteractive) {
@ -916,10 +800,10 @@ again:
*/
static char *
nameEllipsis(
char *name,
int maxlen,
char **prefix)
nameEllipsis(name, maxlen, prefix)
char *name;
int maxlen;
char **prefix;
{
int l = strlen(name);
@ -959,9 +843,9 @@ nameEllipsis(
*/
int
cmdSaveWindSet(
MagWindow *window,
CellDef *def)
cmdSaveWindSet(window, def)
MagWindow *window;
CellDef *def;
{
char caption[200];
CellDef *rootDef;
@ -1013,13 +897,13 @@ static CellDef *newRootDef; /* Pointer to root def of window in which
*/
void
CmdSetWindCaption(
CellUse *newEditUse, /* Pointer to new edit cell use */
CellDef *rootDef) /* Root cell def of the window in which the
CmdSetWindCaption(newEditUse, rootDef)
CellUse *newEditUse; /* Pointer to new edit cell use */
CellDef *rootDef; /* Root cell def of the window in which the
* edit cell was selected.
*/
{
int cmdWindSet(MagWindow *window, ClientData clientData); /* UNUSED */
int cmdWindSet();
newEditDef = (newEditUse) ? newEditUse->cu_def : NULL;
newRootDef = rootDef;
@ -1053,11 +937,9 @@ CmdSetWindCaption(
* ----------------------------------------------------------------------------
*/
/*ARGSUSED*/
int
cmdWindSet(
MagWindow *window,
ClientData clientData) /* UNUSED */
cmdWindSet(window)
MagWindow *window;
{
char caption[200];
CellDef *wDef;
@ -1113,9 +995,9 @@ cmdWindSet(
*/
MagWindow *
CmdGetRootPoint(
Point *point,
Rect *rect)
CmdGetRootPoint(point, rect)
Point *point;
Rect *rect;
{
MagWindow *window;
@ -1148,9 +1030,9 @@ CmdGetRootPoint(
*/
MagWindow *
CmdGetEditPoint(
Point *point,
Rect *rect)
CmdGetEditPoint(point, rect)
Point *point;
Rect *rect;
{
MagWindow *window;
Rect rootRect;
@ -1185,11 +1067,11 @@ CmdGetEditPoint(
*/
bool
CmdWarnWrite(void)
CmdWarnWrite()
{
int count, code;
int cmdWarnWriteFunc(CellDef *cellDef, int *pcount);
static const char * const yesno[] = { "no", "yes", 0 };
int cmdWarnWriteFunc();
static char *yesno[] = { "no", "yes", 0 };
char *prompt;
count = 0;
@ -1207,9 +1089,9 @@ CmdWarnWrite(void)
}
int
cmdWarnWriteFunc(
CellDef *cellDef,
int *pcount)
cmdWarnWriteFunc(cellDef, pcount)
CellDef *cellDef;
int *pcount;
{
if ((cellDef->cd_flags & CDINTERNAL) == 0)
(*pcount)++;
@ -1233,27 +1115,27 @@ cmdWarnWriteFunc(
*/
void
cmdExpandOneLevel(
CellUse *cu,
int bitmask,
bool expand)
cmdExpandOneLevel(cu, bitmask, expand)
CellUse *cu;
int bitmask;
bool expand;
{
extern int cmdExpand1func(CellUse *cu, ClientData bitmask);
extern int cmdExpand1func();
/* first, expand this cell use */
DBExpand(cu, bitmask, expand ? DB_EXPAND : DB_UNEXPAND);
DBExpand(cu, bitmask, expand);
/* now, unexpand its direct children (ONE LEVEL ONLY) */
if (expand)
(void) DBCellEnum(cu->cu_def, cmdExpand1func, INT2CD(bitmask));
(void) DBCellEnum(cu->cu_def, cmdExpand1func, (ClientData) bitmask);
}
int
cmdExpand1func(
CellUse *cu,
ClientData bitmask)
cmdExpand1func(cu, bitmask)
CellUse *cu;
ClientData bitmask;
{
DBExpand(cu, (int)CD2INT(bitmask), DB_UNEXPAND);
DBExpand(cu, (int) bitmask, FALSE);
return 0;
}
@ -1281,13 +1163,13 @@ Transform *cmdSelTrans; /* Shared between CmdGetSelectedCell and
*/
CellUse *
CmdGetSelectedCell(
Transform *pTrans) /* If non-NULL, transform from selected
CmdGetSelectedCell(pTrans)
Transform *pTrans; /* If non-NULL, transform from selected
* cell to root coords is stored here.
*/
{
CellUse *result = NULL;
int cmdGetSelFunc(CellUse *selUse, CellUse *realUse, Transform *transform, CellUse **pResult); /* Forward declaration. */
int cmdGetSelFunc(); /* Forward declaration. */
cmdSelTrans = pTrans;
(void) SelEnumCells(FALSE, (bool *) NULL, (SearchContext *) NULL,
@ -1297,11 +1179,11 @@ CmdGetSelectedCell(
/* ARGSUSED */
int
cmdGetSelFunc(
CellUse *selUse, /* Not used. */
CellUse *realUse, /* The first selected use. */
Transform *transform, /* Transform from coords of realUse to root. */
CellUse **pResult) /* Store realUse here. */
cmdGetSelFunc(selUse, realUse, transform, pResult)
CellUse *selUse; /* Not used. */
CellUse *realUse; /* The first selected use. */
Transform *transform; /* Transform from coords of realUse to root. */
CellUse **pResult; /* Store realUse here. */
{
*pResult = realUse;
if (cmdSelTrans != NULL)
@ -1309,17 +1191,6 @@ cmdGetSelFunc(
return 1; /* Skip any other selected cells. */
}
/* The Open Group, Sep 2006, Austin/317 deprecated isascii(),
* Apparently it cannot be used portably in a localized application.
*/
static int
magic_isascii(int c)
{
return (c & ~0x7f) == 0;
}
/*
* ----------------------------------------------------------------------------
*
@ -1340,10 +1211,10 @@ magic_isascii(int c)
*/
bool
CmdIllegalChars(
char *string, /* String to check for illegal chars. */
char *illegal, /* String containing illegal chars. */
char *msg) /* String identifying what string is
CmdIllegalChars(string, illegal, msg)
char *string; /* String to check for illegal chars. */
char *illegal; /* String containing illegal chars. */
char *msg; /* String identifying what string is
* supposed to represent, for ease in
* printing error messages.
*/
@ -1352,7 +1223,7 @@ CmdIllegalChars(
for (p = string; *p != 0; p++)
{
if (!magic_isascii(*p)) goto error;
if (!isascii(*p)) goto error;
if (iscntrl(*p)) goto error;
for (bad = illegal; *bad != 0; bad++)
{
@ -1361,7 +1232,7 @@ CmdIllegalChars(
continue;
error:
if (!magic_isascii(*p) || iscntrl(*p))
if (!isascii(*p) || iscntrl(*p))
{
TxError("%s contains illegal control character 0x%x\n",
msg, *p);

View File

@ -17,7 +17,7 @@
*/
#ifndef lint
static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/commands/CmdTZ.c,v 1.8 2010/06/24 12:37:15 tim Exp $";
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/commands/CmdTZ.c,v 1.8 2010/06/24 12:37:15 tim Exp $";
#endif /* not lint */
#include <stdio.h>
@ -57,13 +57,13 @@ static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magi
#include "yacr.h"
#endif /* LLNL */
extern void DisplayWindow();
/* Trivial function that returns 1 if called */
int
existFunc(
Tile *tile, /* (unused) */
TileType dinfo, /* (unused) */
ClientData clientdata) /* (unused) */
existFunc(tile)
Tile *tile;
{
return 1;
}
@ -82,9 +82,9 @@ existFunc(
*/
int
checkForPaintFunc(
CellDef *cellDef,
ClientData arg)
checkForPaintFunc(cellDef, arg)
CellDef *cellDef;
ClientData arg;
{
int numPlanes = *((int *)arg);
int pNum, result;
@ -121,7 +121,7 @@ checkForPaintFunc(
*/
bool
CmdCheckForPaintFunc(void)
CmdCheckForPaintFunc()
{
if (DBCellSrDefs(0, checkForPaintFunc, (ClientData)&DBNumPlanes))
return TRUE;
@ -165,21 +165,21 @@ CmdCheckForPaintFunc(void)
#define TECH_REVERT 11
void
CmdTech(
MagWindow *w, /* Window in which command was invoked. */
TxCommand *cmd) /* Info about command options. */
CmdTech(w, cmd)
MagWindow *w; /* Window in which command was invoked. */
TxCommand *cmd; /* Info about command options. */
{
int option, action, i, locargc;
const char * const *msg;
char **msg;
#ifdef MAGIC_WRAPPER
Tcl_Obj *lobj;
#endif
bool noprompt = FALSE;
static const char * const actionNames[] =
static char *actionNames[] =
{ "no", "yes", 0 };
static const char * const cmdTechOption[] =
static char *cmdTechOption[] =
{
"load filename [-noprompt][-[no]override]\n\
Load a new technology",
@ -218,7 +218,7 @@ CmdTech(
Tcl_SetResult(magicinterp, DBTechName, NULL);
break;
case TECH_FILE:
Tcl_SetResult(magicinterp, (char *)TechFileName, NULL);
Tcl_SetResult(magicinterp, TechFileName, NULL);
break;
case TECH_VERSION:
Tcl_SetResult(magicinterp, DBTechVersion, NULL);
@ -415,12 +415,10 @@ CmdTech(
for (ctype = TT_TECHDEPBASE; ctype < DBNumUserLayers; ctype++)
if (DBIsContact(ctype))
{
if (TTMaskHasType(&DBActiveLayerBits, ctype))
DBUnlockContact(ctype);
else
DBLockContact(ctype);
}
for (ctype = DBNumUserLayers; ctype < DBNumTypes; ctype++)
{
@ -455,18 +453,15 @@ CmdTech(
}
if (!strncmp(cmd->tx_argv[2], "width", 5))
{
char *techwidth;
tresult = DRCGetDefaultLayerWidth(t1);
techwidth = DBWPrintValue(tresult, w, TRUE);
#ifdef MAGIC_WRAPPER
Tcl_SetObjResult(magicinterp, Tcl_NewStringObj(techwidth, -1));
Tcl_SetObjResult(magicinterp, Tcl_NewIntObj(tresult));
#else
TxPrintf("Minimum width is %s\n", techwidth);
TxPrintf("Minimum width is %d\n", tresult);
#endif
}
else if (!strncmp(cmd->tx_argv[2], "spac", 4))
{
char *techspace;
if (cmd->tx_argc >= 5)
{
t2 = DBTechNoisyNameType(cmd->tx_argv[4]);
@ -478,16 +473,14 @@ CmdTech(
else
t2 = t1;
tresult = DRCGetDefaultLayerSpacing(t1, t2);
techspace = DBWPrintValue(tresult, w, TRUE);
#ifdef MAGIC_WRAPPER
Tcl_SetObjResult(magicinterp, Tcl_NewStringObj(techspace, -1));
Tcl_SetObjResult(magicinterp, Tcl_NewIntObj(tresult));
#else
TxPrintf("Minimum spacing is %s\n", techspace);
TxPrintf("Minimum spacing is %d\n", tresult);
#endif
}
else if (!strncmp(cmd->tx_argv[2], "surr", 4))
{
char *techsurround;
if (cmd->tx_argc >= 5)
{
t2 = DBTechNoisyNameType(cmd->tx_argv[4]);
@ -503,17 +496,14 @@ CmdTech(
}
tresult = DRCGetDefaultLayerSurround(t1, t2);
techsurround = DBWPrintValue(tresult, w, TRUE);
#ifdef MAGIC_WRAPPER
Tcl_SetObjResult(magicinterp, Tcl_NewStringObj(techsurround, -1));
Tcl_SetObjResult(magicinterp, Tcl_NewIntObj(tresult));
#else
TxPrintf("Minimum surround is %s\n", techsurround);
TxPrintf("Minimum surround is %d\n", tresult);
#endif
}
else if (!strncmp(cmd->tx_argv[2], "direc", 5))
{
char *techdirec;
if (cmd->tx_argc >= 5)
{
t2 = DBTechNoisyNameType(cmd->tx_argv[4]);
@ -529,11 +519,10 @@ CmdTech(
}
tresult = DRCGetDirectionalLayerSurround(t1, t2);
techdirec = DBWPrintValue(tresult, w, TRUE);
#ifdef MAGIC_WRAPPER
Tcl_SetObjResult(magicinterp, Tcl_NewStringObj(techdirec, -1));
Tcl_SetObjResult(magicinterp, Tcl_NewIntObj(tresult));
#else
TxPrintf("Minimum surround (in one orientation) is %s\n", techdirec);
TxPrintf("Minimum surround (in one orientation) is %d\n", tresult);
#endif
}
}
@ -664,9 +653,9 @@ usage2:
*/
void
CmdTool(
MagWindow *w, /* Window in which command was invoked. */
TxCommand *cmd) /* Info about command options. */
CmdTool(w, cmd)
MagWindow *w; /* Window in which command was invoked. */
TxCommand *cmd; /* Info about command options. */
{
if (cmd->tx_argc == 1)
{
@ -682,15 +671,6 @@ CmdTool(
if (strcmp(cmd->tx_argv[1], "info") == 0)
DBWPrintButtonDoc();
else if (strcmp(cmd->tx_argv[1], "type") == 0)
{
char *toolType = DBWGetButtonHandler();
#ifdef MAGIC_WRAPPER
Tcl_SetObjResult(magicinterp, Tcl_NewStringObj(toolType, -1));
#else
TxPrintf("Current tool is \"%s\".\n", toolType);
#endif /* MAGIC_WRAPPER */
}
else (void) DBWChangeButtonHandler(cmd->tx_argv[1]);
}
@ -702,62 +682,32 @@ CmdTool(
* Implement the "unexpand" command.
*
* Usage:
* unexpand [selection|surround|overlap|all]
*
* "selection" unexpands (hides) cells in the selection. All
* other options unexpand cells in the layout. "all" unexpands
* all cells in the layout. "surround" unexpannds cells which
* the cursor box surrounds completely, and "overlap" unexpands
* cells which the cursor box overlaps.
*
* For backwards compatibility:
* "unexpand" alone implements "unexpand surround".
*
* Also see: CmdExpand
* unexpand
*
* Results:
* None.
*
* Side effects:
* Changes the expansion state of cells.
* Unexpands all cells under the box that don't completely
* contain the box.
*
* ----------------------------------------------------------------------------
*/
#define UNEXPAND_SELECTION 0
#define UNEXPAND_SURROUND 1
#define UNEXPAND_OVERLAP 2
#define UNEXPAND_ALL 3
#define UNEXPAND_HELP 4
void
CmdUnexpand(
MagWindow *w,
TxCommand *cmd)
CmdUnexpand(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
int windowMask, boxMask, option;
const char * const *msg;
int windowMask, boxMask;
Rect rootRect;
int cmdUnexpandFunc(); /* Forward reference. */
int cmdUnexpandFunc(CellUse *use, int windowMask); /* Forward reference. */
static const char * const cmdUnexpandOption[] = {
"selection expand cell instances in the selection",
"surround expand cell instances which the cursor box surrounds",
"overlap expand cell instances which the cursor box overlaps",
"all expand all cell instances",
NULL
};
if (cmd->tx_argc > 1)
if (cmd->tx_argc != 1)
{
option = Lookup(cmd->tx_argv[1], cmdUnexpandOption);
if (option < 0) option = UNEXPAND_HELP;
TxError("Usage: %s\n", cmd->tx_argv[0]);
return;
}
else
option = UNEXPAND_SURROUND;
if (option == UNEXPAND_HELP) goto badusage;
windCheckOnlyWindow(&w, DBWclientID);
if (w == (MagWindow *) NULL)
@ -773,42 +723,8 @@ CmdUnexpand(
TxError("The box isn't in the same window as the cursor.\n");
return;
}
switch (option)
{
case UNEXPAND_SELECTION:
SelectExpand(windowMask, DB_UNEXPAND, (Rect *)NULL);
break;
case UNEXPAND_OVERLAP:
DBExpandAll(((CellUse *)w->w_surfaceID), &rootRect, windowMask,
DB_UNEXPAND | DB_EXPAND_OVERLAP,
cmdUnexpandFunc, (ClientData)(pointertype)windowMask);
SelectExpand(windowMask,
DB_UNEXPAND | DB_EXPAND_OVERLAP,
&rootRect);
break;
case UNEXPAND_SURROUND:
DBExpandAll(((CellUse *)w->w_surfaceID), &rootRect, windowMask,
DB_UNEXPAND | DB_EXPAND_SURROUND,
cmdUnexpandFunc, (ClientData)(pointertype)windowMask);
SelectExpand(windowMask,
DB_UNEXPAND | DB_EXPAND_SURROUND,
&rootRect);
break;
case UNEXPAND_ALL:
DBExpandAll(((CellUse *)w->w_surfaceID), &TiPlaneRect, windowMask,
DB_UNEXPAND | DB_EXPAND_OVERLAP,
cmdUnexpandFunc, (ClientData)(pointertype)windowMask);
SelectExpand(windowMask,
DB_UNEXPAND | DB_EXPAND_OVERLAP,
(Rect *)NULL);
break;
}
return;
badusage:
for (msg = &(cmdUnexpandOption[0]); *msg != NULL; msg++)
TxPrintf(" %s\n", *msg);
DBExpandAll(((CellUse *) w->w_surfaceID), &rootRect, windowMask,
FALSE, cmdUnexpandFunc, (ClientData)(pointertype) windowMask);
}
/* This function is called for each cell whose expansion status changed.
@ -817,9 +733,9 @@ badusage:
*/
int
cmdUnexpandFunc(
CellUse *use, /* Use that was just unexpanded. */
int windowMask) /* Window where it was unexpanded. */
cmdUnexpandFunc(use, windowMask)
CellUse *use; /* Use that was just unexpanded. */
int windowMask; /* Window where it was unexpanded. */
{
if (use->cu_parent == NULL) return 0;
DBWAreaChanged(use->cu_parent, &use->cu_bbox, windowMask,
@ -827,182 +743,6 @@ cmdUnexpandFunc(
return 0;
}
/*
* ----------------------------------------------------------------------------
*
* CmdUnits --
*
* Implement the "units" command.
*
* Usage:
* units [value] [print|noprint]
*
* where "value" may be one of "default", "internal", "lambda",
* "user" (equivalently "grid"), or "microns".
*
* Results:
* None.
*
* Side effects:
* The global variable DBWUnits may be changed, which changes the
* behavior of magic when interpreting un-suffixed values or
* displaying values.
*
* Notes:
* The units behavior was previously dependent on what command was
* issued, with results usually being given in internal units, and
* with un-suffixed values following the snap behavior. Backwards-
* compatible behavior is used on startup or at any time by setting
* the units to "default". Otherwise, unit display follows the
* given "units" setting.
*
* ----------------------------------------------------------------------------
*/
#define UNITS_DEFAULT 0
#define UNITS_INTERNAL 1
#define UNITS_LAMBDA 2
#define UNITS_GRID 3
#define UNITS_USER 4
#define UNITS_MICRONS 5
#define UNITS_LIST 6
#define UNITS_PRINT 7
#define UNITS_NOPRINT 8
void
CmdUnits(
MagWindow *w,
TxCommand *cmd)
{
static const char * const names[] = { "default", "internal", "lambda",
"grid", "user", "microns", "list", "print", "noprint", 0 };
int idx, n = UNITS_LIST, n2, saveflag;
DBWclientRec *crec;
if (cmd->tx_argc >= 2)
{
n = Lookup(cmd->tx_argv[1], names);
if (n < 0)
{
TxPrintf("Usage: units [default | internal | lambda | microns"
" | user] [print]\n");
return;
}
if (DBWUnits != DBW_UNITS_DEFAULT)
saveflag = DBWUnits & DBW_UNITS_PRINT_FLAG;
else
saveflag = -1;
switch (n)
{
case UNITS_DEFAULT:
DBWUnits = DBW_UNITS_DEFAULT;
break;
case UNITS_INTERNAL:
DBWUnits = DBW_UNITS_INTERNAL;
break;
case UNITS_LAMBDA:
DBWUnits = DBW_UNITS_LAMBDA;
break;
case UNITS_USER:
case UNITS_GRID:
DBWUnits = DBW_UNITS_USER;
break;
case UNITS_MICRONS:
DBWUnits = DBW_UNITS_MICRONS;
break;
case UNITS_PRINT:
saveflag = DBW_UNITS_PRINT_FLAG;
break;
case UNITS_NOPRINT:
saveflag = 0;
break;
}
if (n < 0)
{
TxError("Unrecognized units option %s\n.", cmd->tx_argv[1]);
return;
}
if (n != UNITS_LIST)
{
if ((cmd->tx_argc == 3) && (n != UNITS_DEFAULT))
{
n2 = Lookup(cmd->tx_argv[2], names);
switch (n2)
{
case UNITS_PRINT:
DBWUnits |= DBW_UNITS_PRINT_FLAG;
break;
case UNITS_NOPRINT:
DBWUnits &= DBW_UNITS_TYPE_MASK;
break;
default:
TxError("Unrecognized units option %s\n.", cmd->tx_argv[2]);
break;
}
}
else if ((n != UNITS_DEFAULT) && (saveflag != -1))
{
/* Preserve the previous value of the print/noprint flag */
DBWUnits &= DBW_UNITS_TYPE_MASK;
DBWUnits |= saveflag;
}
return;
}
}
if (DBWUnits == DBW_UNITS_DEFAULT)
idx = UNITS_DEFAULT;
else
switch (DBWUnits & DBW_UNITS_TYPE_MASK)
{
case DBW_UNITS_INTERNAL:
idx = UNITS_INTERNAL;
break;
case DBW_UNITS_LAMBDA:
idx = UNITS_LAMBDA;
break;
case DBW_UNITS_USER:
idx = UNITS_USER;
break;
case DBW_UNITS_MICRONS:
idx = UNITS_MICRONS;
break;
}
if (n == UNITS_LIST) /* list */
{
#ifdef MAGIC_WRAPPER
Tcl_Obj *tobj;
tobj = Tcl_NewListObj(0, NULL);
Tcl_ListObjAppendElement(magicinterp, tobj,
Tcl_NewStringObj((char *)names[idx], -1));
if (idx != UNITS_DEFAULT)
{
if (DBWUnits & DBW_UNITS_PRINT_FLAG)
Tcl_ListObjAppendElement(magicinterp, tobj,
Tcl_NewStringObj("print", 5));
else
Tcl_ListObjAppendElement(magicinterp, tobj,
Tcl_NewStringObj("noprint", 7));
}
Tcl_SetObjResult(magicinterp, tobj);
#else
TxPrintf("%s", names[idx]);
if (idx != UNITS_DEFAULT)
if (DBWUnits & DBW_UNITS_PRINT_FLAG)
TxPrintf(" print");
TxPrintf("\n");
#endif
}
else if (idx == UNITS_DEFAULT)
TxPrintf("Reported units follow the snap setting.\n");
else if (DBWUnits & DBW_UNITS_PRINT_FLAG)
TxPrintf("Values are reported as %s, along with the units.\n", names[idx]);
else
TxPrintf("Values are reported as %s\n", names[idx]);
}
/*
* ----------------------------------------------------------------------------
*
@ -1024,9 +764,9 @@ CmdUnits(
*/
void
CmdUpsidedown(
MagWindow *w,
TxCommand *cmd)
CmdUpsidedown(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
Transform trans;
Rect rootBox, bbox;
@ -1088,11 +828,9 @@ struct linked_id {
};
int
cmdWhatPrintCell(
Tile *tile, /* (unused) */
TileType dinfo, /* (unused) */
TreeContext *cxp)
int cmdWhatPrintCell(tile, cxp)
Tile *tile;
TreeContext *cxp;
{
struct linked_id **lid = (struct linked_id **)cxp->tc_filter->tf_arg;
struct linked_id *curlid = *lid;
@ -1144,10 +882,7 @@ static LabelStore *labelBlockTop, *labelEntry;
*/
int
cmdFindWhatTileFunc(
Tile *tile,
TileType dinfo,
ClientData clientData)
cmdFindWhatTileFunc(Tile *tile, ClientData clientData)
{
struct linked_id **lid = (struct linked_id **)clientData;
SearchContext scx;
@ -1158,7 +893,7 @@ cmdFindWhatTileFunc(
scx.scx_use = EditCellUse;
scx.scx_trans = GeoIdentityTransform;
if (dinfo & TT_SIDE)
if (SplitSide(tile))
type = SplitRightType(tile);
else
type = SplitLeftType(tile);
@ -1193,9 +928,9 @@ cmdFindWhatTileFunc(
*/
void
CmdWhat(
MagWindow *w, /* Window in which command was invoked. */
TxCommand *cmd) /* Information about the command. */
CmdWhat(w, cmd)
MagWindow *w; /* Window in which command was invoked. */
TxCommand *cmd; /* Information about the command. */
{
int i, locargc;
bool foundAny, editNull = FALSE;
@ -1205,14 +940,11 @@ CmdWhat(
#ifdef MAGIC_WRAPPER
Tcl_Obj *lobj, *paintobj, *paintcellobj, *celllistobj, *labelobj, *cellobj;
extern int cmdWhatCellListFunc(CellUse *selUse, CellUse *realUse, Transform *transform, Tcl_Obj *newobj);
extern int cmdWhatCellListFunc();
#endif
extern int cmdWhatPaintFunc(Rect *rect, TileType type, TileTypeBitMask *mask);
extern int cmdWhatLabelFunc(LabelStore *entry, bool *foundAny);
extern int cmdWhatCellFunc(CellUse *selUse, CellUse *realUse, Transform *transform, bool *foundAny);
extern int cmdWhatLabelPreFunc(Label *label, CellUse *cellUse, Transform *transform, bool *foundAny);
extern int orderLabelFunc(const void *, const void *); /* (LabelStore *one, LabelStore *two) */
extern int cmdWhatPaintFunc(), cmdWhatLabelFunc(), cmdWhatCellFunc();
extern int cmdWhatLabelPreFunc(), orderLabelFunc();
locargc = cmd->tx_argc;
@ -1249,7 +981,7 @@ CmdWhat(
if (EditCellUse == NULL)
{
editNull = TRUE;
EditCellUse = (CellUse *)w->w_surfaceID;
EditCellUse = w->w_surfaceID;
}
/* Find all the selected paint and print out the layer names. */
@ -1356,13 +1088,11 @@ CmdWhat(
}
#endif
free_magic1_t mm1 = freeMagic1_init();
while (lid != NULL)
{
freeMagic1(&mm1, lid);
while (lid != NULL)
{
freeMagic(lid);
lid = lid->lid_next;
}
freeMagic1_end(&mm1);
#ifdef MAGIC_WRAPPER
if (doListAll)
Tcl_ListObjAppendElement(magicinterp, paintobj,
@ -1467,10 +1197,10 @@ CmdWhat(
/*ARGSUSED*/
int
cmdWhatPaintFunc(
Rect *rect, /* Not used. */
TileType type, /* Type of this piece of paint. */
TileTypeBitMask *mask) /* Place to OR in type's bit. */
cmdWhatPaintFunc(rect, type, mask)
Rect *rect; /* Not used. */
TileType type; /* Type of this piece of paint. */
TileTypeBitMask *mask; /* Place to OR in type's bit. */
{
if (type & TT_DIAGONAL)
type = (type & TT_SIDE) ? (type & TT_RIGHTMASK) >> 14 :
@ -1485,11 +1215,11 @@ cmdWhatPaintFunc(
/*ARGSUSED*/
int
cmdWhatLabelPreFunc(
Label *label, /* Label that's selected. */
CellUse *cellUse, /* Cell use containing label. */
Transform *transform, /* Not used. */
bool *foundAny) /* Use to print extra stuff for the first
cmdWhatLabelPreFunc(label, cellUse, transform, foundAny)
Label *label; /* Label that's selected. */
CellUse *cellUse; /* Cell use containing label. */
Transform *transform; /* Not used. */
bool *foundAny; /* Use to print extra stuff for the first
* label found.
*/
{
@ -1529,9 +1259,9 @@ cmdWhatLabelPreFunc(
int
cmdWhatLabelFunc(
LabelStore *entry, /* stored pointers to label info*/
bool *foundAny) /* Use to print extra stuff for the first
cmdWhatLabelFunc(entry, foundAny)
LabelStore *entry; /* stored pointers to label info*/
bool *foundAny; /* Use to print extra stuff for the first
* label found.
*/
{
@ -1581,12 +1311,10 @@ cmdWhatLabelFunc(
/* they are sorted by label name, then cell name, then attached material */
/* that way all of identical names are grouped together */
int
orderLabelFunc(
const void *a, /* one of the labels being compared */
const void *b) /* the other label to compare with */
orderLabelFunc(one, two)
LabelStore *one; /* one of the labels being compared */
LabelStore *two; /* the other label to compare with */
{
LabelStore *one = (LabelStore *)a; /* qsort compar 1st */
LabelStore *two = (LabelStore *)b; /* qsort compar 2nd */
int i;
if ((i = strcmp(one->lab_text, two->lab_text)) != 0)
@ -1605,16 +1333,16 @@ orderLabelFunc(
/*ARGSUSED*/
int
cmdWhatCellFunc(
CellUse *selUse, /* Not used. */
CellUse *realUse, /* Selected cell use. */
Transform *transform, /* Not used. */
bool *foundAny) /* Used to print extra stuff for the first
cmdWhatCellFunc(selUse, realUse, transform, foundAny)
CellUse *selUse; /* Not used. */
CellUse *realUse; /* Selected cell use. */
Transform *transform; /* Not used. */
bool *foundAny; /* Used to print extra stuff for the first
* use found.
*/
{
/* Forward reference */
char *dbGetUseName(CellUse *celluse);
char *dbGetUseName();
if (!*foundAny)
{
@ -1631,15 +1359,15 @@ cmdWhatCellFunc(
/* Same search function as above, but appends use names to a Tcl list */
int
cmdWhatCellListFunc(
CellUse *selUse, /* Not used. */
CellUse *realUse, /* Selected cell use. */
Transform *transform, /* Not used. */
Tcl_Obj *newobj) /* Tcl list object holding use names */
cmdWhatCellListFunc(selUse, realUse, transform, newobj)
CellUse *selUse; /* Not used. */
CellUse *realUse; /* Selected cell use. */
Transform *transform; /* Not used. */
Tcl_Obj *newobj; /* Tcl list object holding use names */
{
Tcl_Obj *tuple;
/* Forward reference */
char *dbGetUseName(CellUse *celluse);
char *dbGetUseName();
tuple = Tcl_NewListObj(0, NULL);
Tcl_ListObjAppendElement(magicinterp, tuple,
@ -1686,23 +1414,20 @@ cmdWhatCellListFunc(
#define SEGMENT 11
void
CmdWire(
MagWindow *w,
TxCommand *cmd)
CmdWire(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
int option, locargc;
const char * const *msg;
char *lastargv;
char **msg, *lastargv;
TileType type;
int width;
Point point, rootPoint;
bool needCoord = FALSE;
#ifdef MAGIC_WRAPPER
Tcl_Obj *lobj;
#endif
static const char * const cmdWireOption[] =
static char *cmdWireOption[] =
{
"decrement layer|width decrement the wire layer or width",
"help print this help information",
@ -1774,11 +1499,11 @@ CmdWire(
int value = 1;
if (cmd->tx_argc == 4)
value = cmdParseCoord(w, cmd->tx_argv[3], TRUE, TRUE);
WirePickType(WireType, (Point *)NULL, WireWidth - value);
WirePickType(WireType, WireWidth - value);
}
else
goto badargs;
break;
return;
case INCREMENT:
if (cmd->tx_argc != 3 && cmd->tx_argc != 4)
@ -1814,11 +1539,11 @@ CmdWire(
int value = 1;
if (cmd->tx_argc == 4)
value = cmdParseCoord(w, cmd->tx_argv[3], TRUE, TRUE);
WirePickType(WireType, (Point *)NULL, WireWidth + value);
WirePickType(WireType, WireWidth + value);
}
else
goto badargs;
break;
return;
case HELP:
@ -1828,41 +1553,15 @@ CmdWire(
{
TxPrintf(" %s\n", *msg);
}
break;
return;
case HORIZONTAL:
if ((cmd->tx_argc > 2) && strcmp(cmd->tx_argv[2], "to") == 0)
{
if (cmd->tx_argc != 5)
goto badargs;
point.p_x = cmdParseCoord(w, cmd->tx_argv[3], FALSE, TRUE);
point.p_y = cmdParseCoord(w, cmd->tx_argv[4], FALSE, FALSE);
GeoTransPoint(&EditToRootTransform, &point, &rootPoint);
WireAddLeg((Rect *)NULL, &rootPoint, WIRE_HORIZONTAL);
}
else
{
WireAddLeg((Rect *) NULL, (Point *) NULL, WIRE_HORIZONTAL);
needCoord = TRUE;
}
break;
WireAddLeg((Rect *) NULL, (Point *) NULL, WIRE_HORIZONTAL);
return;
case LEG:
if ((cmd->tx_argc > 2) && strcmp(cmd->tx_argv[2], "to") == 0)
{
if (cmd->tx_argc != 5)
goto badargs;
point.p_x = cmdParseCoord(w, cmd->tx_argv[3], FALSE, TRUE);
point.p_y = cmdParseCoord(w, cmd->tx_argv[4], FALSE, FALSE);
GeoTransPoint(&EditToRootTransform, &point, &rootPoint);
WireAddLeg((Rect *)NULL, &rootPoint, WIRE_CHOOSE);
}
else
{
WireAddLeg((Rect *)NULL, (Point *)NULL, WIRE_CHOOSE);
needCoord = TRUE;
}
break;
WireAddLeg((Rect *) NULL, (Point *) NULL, WIRE_CHOOSE);
return;
case SHOW:
WireShowLeg();
@ -1896,17 +1595,7 @@ CmdWire(
case TYPE:
if (locargc == 2)
{
WirePickType(-1, (Point *)NULL, 0);
needCoord = TRUE;
}
else if ((locargc == 5) && !strcmp(cmd->tx_argv[2], "at"))
{
point.p_x = cmdParseCoord(w, cmd->tx_argv[3], FALSE, TRUE);
point.p_y = cmdParseCoord(w, cmd->tx_argv[4], FALSE, FALSE);
GeoTransPoint(&EditToRootTransform, &point, &rootPoint);
WirePickType(-1, &rootPoint, 0);
}
WirePickType(-1, 0);
else if (locargc != 3 && locargc != 4)
{
badargs:
@ -1937,7 +1626,7 @@ CmdWire(
}
else
width = cmdParseCoord(w, cmd->tx_argv[3], TRUE, TRUE);
WirePickType(type, (Point *)NULL, width);
WirePickType(type, width);
return;
}
break;
@ -1945,52 +1634,35 @@ CmdWire(
case VALUES:
if (locargc == 2)
{
char *wdisp;
width = WireGetWidth();
type = WireGetType();
wdisp = DBWPrintValue(width, w, TRUE);
#ifdef MAGIC_WRAPPER
lobj = Tcl_NewListObj(0, NULL);
Tcl_ListObjAppendElement(magicinterp, lobj,
Tcl_NewStringObj(DBTypeLongNameTbl[type], -1));
Tcl_NewIntObj(width));
Tcl_ListObjAppendElement(magicinterp, lobj,
Tcl_NewStringObj(wdisp, -1));
Tcl_NewStringObj(DBTypeLongNameTbl[type], -1));
Tcl_SetObjResult(magicinterp, lobj);
#else
TxPrintf("Wire layer %s, width %s\n",
DBTypeLongNameTbl[type], wdisp);
TxPrintf("Wire layer %s, width %d\n",
DBTypeLongNameTbl[type], width);
#endif
}
break;
return;
case VERTICAL:
if ((cmd->tx_argc > 2) && strcmp(cmd->tx_argv[2], "to") == 0)
{
if (cmd->tx_argc != 5)
goto badargs;
point.p_x = cmdParseCoord(w, cmd->tx_argv[3], FALSE, TRUE);
point.p_y = cmdParseCoord(w, cmd->tx_argv[4], FALSE, FALSE);
GeoTransPoint(&EditToRootTransform, &point, &rootPoint);
WireAddLeg((Rect *)NULL, &rootPoint, WIRE_VERTICAL);
}
else
{
WireAddLeg((Rect *) NULL, (Point *) NULL, WIRE_VERTICAL);
needCoord = TRUE;
}
break;
WireAddLeg((Rect *) NULL, (Point *) NULL, WIRE_VERTICAL);
return;
case WIDTH:
if (locargc == 2)
{
char *wdisp;
width = WireGetWidth();
wdisp = DBWPrintValue(width, w, TRUE);
#ifdef MAGIC_WRAPPER
lobj = Tcl_NewStringObj(wdisp, -1);
lobj = Tcl_NewIntObj(width);
Tcl_SetObjResult(magicinterp, lobj);
#else
TxPrintf("Wire width is %s\n", wdisp);
TxPrintf("Wire width is %d\n", width);
#endif
}
else if (locargc != 3)
@ -1999,7 +1671,7 @@ CmdWire(
{
width = cmdParseCoord(w, cmd->tx_argv[2], TRUE, TRUE);
type = WireGetType();
WirePickType(type, (Point *)NULL, width);
WirePickType(type, width);
return;
}
break;
@ -2089,7 +1761,6 @@ CmdWire(
TxError("Bad coordinate pair at %s line %d\n",
cmd->tx_argv[4], i + 1);
freeMagic(plist);
fclose(pfile);
return;
}
@ -2149,22 +1820,6 @@ CmdWire(
}
break;
}
/* Recast the command as "wire <option> to <x> <y>" so that it no longer
* depends on the pointer position, for command logging.
*/
if (needCoord)
{
if (ToolGetPoint(&rootPoint, (Rect *)NULL) != NULL)
{
GeoTransPoint(&RootToEditTransform, &rootPoint, &point);
sprintf(cmd->tx_argstring, "wire %s %s %di %di",
cmd->tx_argv[1],
(option == TYPE) ? "at" : "to",
point.p_x, point.p_y);
TxRebuildCommand(cmd);
}
}
}
/*
@ -2197,13 +1852,13 @@ CmdWire(
#define OPT_WRITEALL_MODIFIED 1
void
CmdWriteall(
MagWindow *w,
TxCommand *cmd)
CmdWriteall(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
int cmdWriteallFunc(CellDef *def, TxCommand *cmd);
int cmdWriteallFunc();
int option = -1;
static const char * const writeallOpts[] = { "force", "modified", 0 };
static char *writeallOpts[] = { "force", "modified", 0 };
int argc;
int flags = CDMODIFIED | CDBOXESCHANGED | CDSTAMPSCHANGED;
@ -2213,7 +1868,7 @@ CmdWriteall(
option = Lookup(cmd->tx_argv[1], writeallOpts);
if (option < 0)
{
TxError("Usage: %s [force|modified [cellname ...]]\n",
TxError("Usage: %s [force|modified|noupdate [cellname ...]]\n",
cmd->tx_argv[0]);
return;
}
@ -2254,11 +1909,11 @@ CmdWriteall(
/*ARGSUSED*/
int
cmdWriteallFunc(
CellDef *def, /* Pointer to CellDef to be saved. This def might
cmdWriteallFunc(def, cmd)
CellDef *def; /* Pointer to CellDef to be saved. This def might
* be an internal buffer; if so, we ignore it.
*/
TxCommand *cmd) /* Client data passed to DBCellSrDefs, a pointer
TxCommand *cmd; /* Client data passed to DBCellSrDefs, a pointer
* to the command structure. If cmd->tx_argc == 1,
* then prompt for each action. If cmd->tx_argc
* == 2, then write all cells without asking. If
@ -2268,9 +1923,9 @@ cmdWriteallFunc(
{
char *prompt, *argv;
int i, action, cidx = 0;
static const char * const actionNames[] =
static char *actionNames[] =
{ "write", "flush", "skip", "abort", "autowrite", 0 };
static const char * const explain[] =
static char *explain[] =
{ "", "(bboxes)", "(timestamps)", "(bboxes/timestamps)", 0 };
if (def->cd_flags & CDINTERNAL) return 0;
@ -2357,9 +2012,9 @@ cmdWriteallFunc(
*/
void
CmdXload(
MagWindow *w,
TxCommand *cmd)
CmdXload(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
windCheckOnlyWindow(&w, DBWclientID);
if (w == (MagWindow *) NULL)
@ -2405,9 +2060,9 @@ CmdXload(
*/
void
CmdXor(
MagWindow *w,
TxCommand *cmd)
CmdXor(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
int rval, xMask;
bool dolabels;

View File

@ -20,11 +20,10 @@
*/
#ifndef lint
static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/commands/CmdWizard.c,v 1.2 2008/02/10 19:30:19 tim Exp $";
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/commands/CmdWizard.c,v 1.2 2008/02/10 19:30:19 tim Exp $";
#endif /* not lint */
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
@ -47,16 +46,12 @@ static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magi
#include "utils/utils.h"
#include "textio/txcommands.h"
/* For diagnostics */
#include "cif/CIFint.h"
#include "database/databaseInt.h"
/* C99 compat */
#include "extract/extract.h"
/* Forward declarations */
extern void cmdPsearchStats(char *str, struct tms *tl, struct tms *td, int count);
extern void cmdPsearchStats();
void cmdStatsHier(CellDef *, int, CellDef *);
@ -83,9 +78,9 @@ void cmdStatsHier(CellDef *, int, CellDef *);
*/
void
CmdCoord(
MagWindow *w,
TxCommand *cmd)
CmdCoord(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
MagWindow *pointW = (MagWindow *) NULL;
Rect editRect, rootRect;
@ -185,242 +180,14 @@ CmdCoord(
#ifndef NO_EXT
void
CmdExtractTest(
MagWindow *w,
TxCommand *cmd)
CmdExtractTest(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
ExtractTest(w, cmd);
}
#endif
/*
* ----------------------------------------------------------------------------
*
* tileCountProc --
*
* Routine to count tiles.
*
* Return:
* 0 to keep the search going
*
* Side effects:
* Keeps count in clientData
*
* ----------------------------------------------------------------------------
*/
int
tileCountProc(
Tile *tile, /* (unused) */
TileType dinfo, /* (unused) */
int *tcount)
{
(*tcount)++;
return 0;
}
/*
* ----------------------------------------------------------------------------
*
* showMem --
* CmdShowmem --
*
* Usage:
*
* showmem [outfile]
*
* Display all the (principle) internal memory usage for tiles, including
* all cell defs, and all CIF generated planes.
*
* Results:
* None.
*
* Side effects:
* May write to a disk file.
*
* ----------------------------------------------------------------------------
*/
void
showMem(
FILE *outf, /* File to which information is to be output */
bool verbose) /* If TRUE, output detailed erase table */
{
int ttotal, ttotal1, ttotal2;
int i;
Plane *plane;
CellDef *def;
int pNum;
HashSearch hs;
HashEntry *entry;
fprintf(outf, "Tile memory usage summary\n");
fprintf(outf, "Technology %s\n", DBTechName);
/* Search every cell def (including internal ones), count tiles,
* and add up the tile memory usage on every plane.
*/
/* Search the CIFPlanes and count tiles. */
/* CIFPlanes, CIFTotalPlanes, CIFComponentPlanes */
ttotal2 = 0;
if (CIFCurStyle != NULL)
{
fprintf(outf, "\nCIFPlanes:\n");
ttotal1 = 0;
for (i = 0; i < MAXCIFLAYERS; i++)
{
plane = CIFPlanes[i];
if (plane != NULL)
{
ttotal = 0;
DBSrPaintArea((Tile *)NULL, plane, &TiPlaneRect,
&DBAllTypeBits, tileCountProc, &ttotal);
ttotal1 += ttotal;
if (CIFCurStyle->cs_layers[i])
fprintf(outf, " layer %s: %ld\n",
CIFCurStyle->cs_layers[i]->cl_name,
(long)ttotal * (long)sizeof(Tile));
else
fprintf(outf, " layer %d: %d\n", i,
(long)ttotal * (long)sizeof(Tile));
}
}
fprintf(outf, " Subtotal: %ld bytes\n",
(long)ttotal1 * (long)sizeof(Tile));
ttotal2 += ttotal1;
fprintf(outf, "\nCIFTotalPlanes\n");
ttotal1 = 0;
for (i = 0; i < MAXCIFLAYERS; i++)
{
plane = CIFTotalPlanes[i];
if (plane != NULL)
{
ttotal = 0;
DBSrPaintArea((Tile *)NULL, plane, &TiPlaneRect,
&DBAllTypeBits, tileCountProc, &ttotal);
ttotal1 += ttotal;
if (CIFCurStyle->cs_layers[i])
fprintf(outf, " layer %s: %ld\n",
CIFCurStyle->cs_layers[i]->cl_name,
(long)ttotal * (long)sizeof(Tile));
else
fprintf(outf, " layer %d: %d\n", i,
(long)ttotal * (long)sizeof(Tile));
}
}
fprintf(outf, " Subtotal: %ld bytes\n",
(long)ttotal1 * (long)sizeof(Tile));
ttotal2 += ttotal1;
fprintf(outf, "\nCIFComponentPlanes\n");
ttotal1 = 0;
for (i = 0; i < MAXCIFLAYERS; i++)
{
plane = CIFComponentPlanes[i];
if (plane != NULL)
{
ttotal = 0;
DBSrPaintArea((Tile *)NULL, plane, &TiPlaneRect,
&DBAllTypeBits, tileCountProc, &ttotal);
ttotal1 += ttotal;
if (CIFCurStyle->cs_layers[i])
fprintf(outf, " layer %s: %ld bytes\n",
CIFCurStyle->cs_layers[i]->cl_name,
(long)ttotal * (long)sizeof(Tile));
else
fprintf(outf, " layer %d: %ld bytes\n", i,
(long)ttotal * (long)sizeof(Tile));
}
}
fprintf(outf, " Subtotal: %ld bytes\n",
(long)ttotal1 * (long)sizeof(Tile));
ttotal2 += ttotal1;
}
else
{
fprintf(outf, "CIF planes: No memory usage\n");
}
HashStartSearch(&hs);
while ((entry = HashNext(&dbCellDefTable, &hs)) != NULL)
{
def = (CellDef *)HashGetValue(entry);
if (def != (CellDef *)NULL)
{
fprintf(outf, "\nCell def %s\n", def->cd_name);
ttotal1 = 0;
for (pNum = 0; pNum < DBNumPlanes; pNum++)
{
plane = def->cd_planes[pNum];
if (plane != NULL)
{
ttotal = 0;
DBSrPaintArea((Tile *)NULL, plane, &TiPlaneRect,
&DBAllTypeBits, tileCountProc, &ttotal);
fprintf(outf, " plane %s: %ld bytes\n",
DBPlaneLongNameTbl[pNum],
(long)ttotal * (long)sizeof(Tile));
ttotal1 += ttotal;
}
}
fprintf(outf, " Subtotal: %ld bytes\n",
(long)ttotal1 * (long)sizeof(Tile));
ttotal2 += ttotal1;
}
}
fprintf(outf, " Grand total: %ld bytes\n",
(long)ttotal2 * (long)sizeof(Tile));
}
void
CmdShowmem(
MagWindow *w,
TxCommand *cmd)
{
FILE *outf;
bool verbose;
char **av;
int ac;
if (cmd->tx_argc > 3)
{
TxError("Usage: showmem [-v] [file]\n");
return;
}
verbose = FALSE;
av = &cmd->tx_argv[1];
ac = cmd->tx_argc - 1;
outf = stdout;
if (ac > 0 && strcmp(av[0], "-v") == 0)
{
verbose = TRUE;
av++, ac--;
}
if (ac > 0)
{
outf = fopen(av[0], "w");
if (outf == (FILE *) NULL)
{
perror(av[0]);
TxError("Nothing written\n");
return;
}
}
showMem(outf, verbose);
if (outf != stdout)
(void) fclose(outf);
}
/*
* ----------------------------------------------------------------------------
@ -444,9 +211,9 @@ CmdShowmem(
*/
void
showTech(
FILE *outf, /* File to which information is to be output */
bool verbose) /* If TRUE, output detailed erase table */
showTech(outf, verbose)
FILE *outf; /* File to which information is to be output */
bool verbose; /* If TRUE, output detailed erase table */
{
int i, j;
int pNum;
@ -464,7 +231,7 @@ showTech(
fprintf(outf, "\n");
fprintf(outf, "Types:\n");
for (i = 0; i < DBNumTypes; i++) {
int pl ; const char *spl ;
int pl ; char *spl ;
pl = DBPlane(i);
spl = ( pl <= 0 || pl > DBNumPlanes ) ? "??" : DBPlaneLongName(pl);
@ -591,9 +358,9 @@ showTech(
}
void
CmdShowtech(
MagWindow *w,
TxCommand *cmd)
CmdShowtech(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
FILE *outf;
bool verbose;
@ -659,16 +426,16 @@ CmdShowtech(
*/
void
CmdTilestats(
MagWindow *w,
TxCommand *cmd)
CmdTilestats(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
CellUse *selectedUse;
FILE *outf = stdout;
bool allDefs = FALSE;
char **av = cmd->tx_argv + 1;
int ac = cmd->tx_argc - 1;
int cmdStatsFunc(CellDef *def, FILE *outf);
int cmdStatsFunc();
if (ac > 2)
{
@ -743,12 +510,11 @@ int totalTiles[TT_MAXTYPES];
*/
int
cmdStatsFunc(
CellDef *def,
FILE *outf)
cmdStatsFunc(def, outf)
CellDef *def;
FILE *outf;
{
int cmdStatsCount(CellDef *def, struct countClient *cc);
int cmdStatsOutput(CellDef *def, struct countClient *cc);
int cmdStatsCount(), cmdStatsOutput();
struct countClient cc;
int total;
TileType t;
@ -797,17 +563,15 @@ cmdStatsFunc(
*/
int
cmdStatsCount(
CellDef *def,
struct countClient *cc)
cmdStatsCount(def, cc)
CellDef *def;
struct countClient *cc;
{
int cmdStatsCountTile();
int pNum;
struct cellInfo *ci;
TileType t;
/* Forward declaration */
int cmdStatsCountTile(Tile *tile, TileType dinfo, struct cellInfo *ci);
if (def->cd_client)
return (1);
@ -830,10 +594,9 @@ cmdStatsCount(
}
int
cmdStatsCountTile(
Tile *tile,
TileType dinfo, /* (unused) */
struct cellInfo *ci)
cmdStatsCountTile(tile, ci)
Tile *tile;
struct cellInfo *ci;
{
TileType type = TiGetType(tile);
@ -874,10 +637,9 @@ cmdStatsCountTile(
*/
void
cmdStatsHier(
CellDef *parent,
int nuses,
CellDef *child)
cmdStatsHier(parent, nuses, child)
CellDef *parent, *child;
int nuses;
{
struct cellInfo *pi, *ci;
TileType t;
@ -922,9 +684,9 @@ cmdStatsHier(
*/
int
cmdStatsOutput(
CellDef *def,
struct countClient *cc)
cmdStatsOutput(def, cc)
CellDef *def;
struct countClient *cc;
{
TileType t;
struct cellInfo *ci;
@ -987,11 +749,11 @@ cmdStatsOutput(
*/
void
CmdPsearch(
MagWindow *w,
TxCommand *cmd)
CmdPsearch(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
char *RunStats(int flags, struct tms *lastt, struct tms *deltat);
char *RunStats();
static struct tms tlast, tdelta;
Point p;
Plane *plane;
@ -1053,13 +815,12 @@ CmdPsearch(
}
void
cmdPsearchStats(
char *str,
struct tms *tl,
struct tms *td,
int count)
cmdPsearchStats(str, tl, td, count)
char *str;
struct tms *tl, *td;
int count;
{
char *RunStats(int flags, struct tms *lastt, struct tms *deltat);
char *RunStats();
char *rstatp;
int us, ups;
@ -1099,22 +860,20 @@ int numTilesFound;
bool cmdTsearchDebug = FALSE;
void
CmdTsearch(
MagWindow *w,
TxCommand *cmd)
CmdTsearch(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
char *rstatp;
int cmdTsrFunc();
char *RunStats(), *rstatp;
static TileTypeBitMask mask;
static struct tms tlast, tdelta;
Rect rtool, rsearch;
/**** Rect *ebox; ****/
Plane *plane;
int i, pNum, count;
int usPerSearch, usPerTile, usPerL2, us, boxarea;
/* Forward declarations */
int cmdTsrFunc(Tile *tp, TileType dinfo, ClientData clientdata);
char *RunStats(int flags, struct tms *lastt, struct tms *deltat);
if (cmd->tx_argc < 3 || cmd->tx_argc > 5)
{
TxError("Usage: tsearch plane count [mask [new|mayo]]\n");
@ -1213,13 +972,11 @@ CmdTsearch(
}
int
cmdTsrFunc(
Tile *tp,
TileType dinfo, /* (unused) */
ClientData clientdata) /* (unused) */
cmdTsrFunc(tp)
Tile *tp;
{
if (cmdTsearchDebug)
TxPrintf("%lx\n", (intptr_t) tp);
TxPrintf("%x\n", tp);
numTilesFound++;
return 0;
}
@ -1242,9 +999,9 @@ cmdTsrFunc(
*/
void
CmdWatch(
MagWindow *w,
TxCommand *cmd)
CmdWatch(w, cmd)
MagWindow *w;
TxCommand *cmd;
{
DBWclientRec *crec;
int pNum;
@ -1285,7 +1042,7 @@ CmdWatch(
pNum = DBTechNamePlane(cmd->tx_argv[1]);
if (pNum < 0)
{
const char *cp;
char *cp;
TxError("Unrecognized plane: %s. Legal names are:\n",
cmd->tx_argv[1]);
for(pNum=0; pNum < PL_MAXTYPES; pNum++) {
@ -1295,16 +1052,8 @@ CmdWatch(
};
return;
}
if (EditCellUse != NULL)
{
crec->dbw_watchDef = EditCellUse->cu_def;
crec->dbw_watchTrans = EditToRootTransform;
}
else
{
crec->dbw_watchDef = ((CellUse *)w->w_surfaceID)->cu_def;
crec->dbw_watchTrans = ((CellUse *)w->w_surfaceID)->cu_transform;
}
crec->dbw_watchDef = EditCellUse->cu_def;
crec->dbw_watchTrans = EditToRootTransform;
}
crec->dbw_watchPlane = pNum;

View File

@ -12,9 +12,10 @@ SRCS = CmdSubrs.c CmdAB.c CmdCD.c CmdE.c CmdFI.c \
module: ${MAGICDIR}/readline/readline lib${MODULE}.o
# Delegate this task to the readline/Makefile
${MAGICDIR}/readline/readline:
${MAKE} -C ${MAGICDIR}/readline readline-create-symlinks
@if ( ! test -f ${MAGICDIR}/readline/readline ) ; then \
(cd ${MAGICDIR}/readline; ln -s `ls | grep readline` readline) ; \
fi
include ${MAGICDIR}/defs.mak
include ${MAGICDIR}/rules.mak

View File

@ -20,12 +20,11 @@
* rcsid $Header: /usr/cvsroot/magic-8.0/commands/commands.h,v 1.3 2009/01/19 15:43:03 tim Exp $
*/
#ifndef _MAGIC__COMMANDS__COMMANDS_H
#define _MAGIC__COMMANDS__COMMANDS_H
#ifndef _COMMANDS_H
#define _COMMANDS_H
#include "windows/windows.h"
#include "database/database.h"
#include "textio/txcommands.h" /* TxCommand */
/*
* Name of default yank buffer
@ -51,28 +50,30 @@ extern TileTypeBitMask CmdYMAllButSpace;
/* --------------------- Global procedure headers --------------------- */
extern MagWindow *CmdGetEditPoint(Point *point, Rect *rect);
extern MagWindow *CmdGetRootPoint(Point *point, Rect *rect);
extern bool CmdWarnWrite(void);
extern bool CmdParseLayers(char *s, TileTypeBitMask *mask);
extern void CmdLabelProc(char *text, int font, int size, int rotate, int offx, int offy,
int pos, bool sticky, TileType type);
extern void CmdSetWindCaption(CellUse *newEditUse, CellDef *rootDef);
extern CellUse *CmdGetSelectedCell(Transform *pTrans);
extern bool CmdIllegalChars(char *string, char *illegal, char *msg);
extern TileType CmdFindNetProc(char *nodename, CellUse *use, Rect *rect, bool warn_not_found, bool *isvalid);
extern bool CmdCheckForPaintFunc(void);
extern MagWindow *CmdGetRootBox();
extern MagWindow *CmdGetEditPoint();
extern MagWindow *CmdGetRootPoint();
extern bool CmdWarnWrite();
extern bool CmdParseLayers();
extern void CmdAddSlop();
extern void CmdLabelProc();
extern void CmdSetWindCaption();
extern CellUse *CmdGetSelectedCell();
extern bool CmdIllegalChars();
extern void CmdDoMacro();
extern TileType CmdFindNetProc();
extern bool CmdCheckForPaintFunc();
/* C99 compat */
extern int cmdScaleCoord(MagWindow *w, char *arg, bool is_relative, bool is_x, int scale);
extern void FlatCopyAllLabels(SearchContext *scx, TileTypeBitMask *mask, int xMask, CellUse *targetUse);
extern bool cmdDumpParseArgs(char *cmdName, MagWindow *w, TxCommand *cmd, CellUse *dummy, SearchContext *scx);
extern void cmdFlushCell(CellDef *def, bool force_deref);
extern int cmdParseCoord(MagWindow *w, char *arg, bool is_relative, bool is_x);
extern void cmdSaveCell(CellDef *cellDef, char *newName, bool noninteractive, bool tryRename);
extern void CmdInit(void);
extern int cmdScaleCoord();
extern void FlatCopyAllLabels();
extern bool cmdDumpParseArgs();
extern void cmdFlushCell();
extern int cmdParseCoord();
extern void cmdSaveCell();
extern void CmdInit();
extern void CmdDoProperty(CellDef *def, MagWindow *w, TxCommand *cmd, int argstart);
extern void CmdPaintEraseButton(MagWindow *w, Point *refPoint, bool isPaint, bool isScreen);
extern void CmdDoProperty();
extern void CmdPaintEraseButton();
#endif /* _MAGIC__COMMANDS__COMMANDS_H */
#endif /* _COMMANDS_H */

2
configure vendored
View File

@ -9,4 +9,4 @@
# script itself. It also sets up CFLAGS without the default optimizer
# flag (-O2).
( CFLAGS=${CFLAGS:-"-g"}; export CFLAGS; cd scripts ; ./configure "$@" )
( CFLAGS="-g"; export CFLAGS; cd scripts ; ./configure "$@" )

View File

@ -30,32 +30,19 @@ static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/
typedef struct dbcellboundstruct
{
Rect *area;
Rect *extended;
bool extended;
bool found;
} DBCellBoundStruct;
/*
* --------------------------------------------------------------------
* DBBoundCellPlane ---
*
* Find the extents of all subcells of the cell "def", both the
* extent of geometry (rect) and the extent of geometry plus any
* labels extending outside the extent of geometry (extended).
*
* Results:
* TRUE if subcells were found and measured; FALSE if no subcells
* were found (in which case "extended" and "rect" may not be
* valid).
*
* Side effects:
* Values may be recorded in "extended" and "rect".
* --------------------------------------------------------------------
*/
int
DBBoundCellPlane(def, extended, rect)
CellDef *def;
Rect *extended;
bool extended;
Rect *rect;
{
TreeFilter filter;
@ -83,19 +70,25 @@ dbCellBoundFunc(use, fp)
CellUse *use;
TreeFilter *fp;
{
Rect *bbox;
DBCellBoundStruct *cbs;
cbs = (DBCellBoundStruct *)fp->tf_arg;
bbox = &use->cu_bbox;
if (cbs->found)
{
GeoInclude(&use->cu_extended, cbs->extended);
GeoInclude(&use->cu_bbox, cbs->area);
if (cbs->extended)
GeoInclude(&use->cu_extended, cbs->area);
else
GeoInclude(&use->cu_bbox, cbs->area);
}
else
{
*cbs->extended = use->cu_extended;
*cbs->area = use->cu_bbox;
if (cbs->extended)
*cbs->area = use->cu_extended;
else
*cbs->area = use->cu_bbox;
cbs->found = TRUE;
}
return 0;

View File

@ -106,57 +106,18 @@ DBCellFindDup(use, parent)
BPEnumInit(&bpe, parent->cd_cellPlane, &use->cu_bbox, BPE_EQUAL,
"DBCellFindDup");
while ((dupUse = BPEnumNext(&bpe)))
while (dupUse = BPEnumNext(&bpe))
if (dupUse->cu_def == use->cu_def)
{
bool transMatch, arrayMatch, notXarray, notYarray;
/* Transforms must be equal---Aligned bounding boxes are
* an insufficient measure of exact overlap. Also, array
* counts and separation must match for arrayed devices
* an insufficient measure of exact overlap.
*/
transMatch = ((dupUse->cu_transform.t_a == use->cu_transform.t_a) &&
if ((dupUse->cu_transform.t_a == use->cu_transform.t_a) &&
(dupUse->cu_transform.t_b == use->cu_transform.t_b) &&
(dupUse->cu_transform.t_c == use->cu_transform.t_c) &&
(dupUse->cu_transform.t_d == use->cu_transform.t_d) &&
(dupUse->cu_transform.t_e == use->cu_transform.t_e) &&
(dupUse->cu_transform.t_f == use->cu_transform.t_f));
/* First check if both use and dupUse are not arrays. */
notXarray = (dupUse->cu_xhi == dupUse->cu_xlo) &&
(use->cu_xhi == use->cu_xlo);
notYarray = (dupUse->cu_yhi == dupUse->cu_ylo) &&
(use->cu_yhi == use->cu_ylo);
arrayMatch = (notXarray && notYarray);
/* If they are arrays, then the array parameters must match. */
if (!notXarray && notYarray)
{
arrayMatch = ((dupUse->cu_xhi - dupUse->cu_xlo) ==
(use->cu_xhi - use->cu_xlo)) &&
(dupUse->cu_xsep == use->cu_xsep);
}
else if (!notYarray && notXarray)
{
arrayMatch = ((dupUse->cu_yhi - dupUse->cu_ylo) ==
(use->cu_yhi - use->cu_ylo)) &&
(dupUse->cu_ysep == use->cu_ysep);
}
else if (!notYarray && !notXarray)
{
arrayMatch = (((dupUse->cu_xhi - dupUse->cu_xlo) ==
(use->cu_xhi - use->cu_xlo)) &&
(dupUse->cu_xsep == use->cu_xsep)) &&
(((dupUse->cu_yhi - dupUse->cu_ylo) ==
(use->cu_yhi - use->cu_ylo)) &&
(dupUse->cu_ysep == use->cu_ysep));
}
if (transMatch && arrayMatch)
(dupUse->cu_transform.t_f == use->cu_transform.t_f))
break;
}
BPEnumTerm(&bpe);
return dupUse;

View File

@ -59,15 +59,15 @@ static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/
*/
char *
DBPrintUseId(
SearchContext *scx, /* Pointer to current search context, specifying a
DBPrintUseId(scx, name, size, display_only)
SearchContext *scx; /* Pointer to current search context, specifying a
* cell use and X,Y array indices.
*/
char *name, /* Pointer to string into which we will copy the
char *name; /* Pointer to string into which we will copy the
* print name of this instance.
*/
int size, /* Maximum number of characters to copy into string. */
bool display_only) /* TRUE if called for displaying only */
int size; /* Maximum number of characters to copy into string. */
bool display_only; /* TRUE if called for displaying only */
{
CellUse *use = scx->scx_use;
char *sp, *id, *ep;
@ -619,9 +619,8 @@ dbReComputeBboxFunc(cellDef, boundProc, recurseProc)
/*
* Include area of subcells separately
*/
if (!((foundAny = DBBoundCellPlane(cellDef, &extended, &rect)) > 0))
extended = GeoNullRect;
area = rect;
if ((foundAny = DBBoundCellPlane(cellDef, TRUE, &rect)) > 0)
area = rect;
for (pNum = PL_PAINTBASE; pNum < DBNumPlanes; pNum++)
if (pNum != PL_DRC_CHECK)
@ -635,7 +634,7 @@ dbReComputeBboxFunc(cellDef, boundProc, recurseProc)
}
/*
* Include the area of label anchors, too.
* Include the area of labels, too.
*/
for (label = cellDef->cd_labels; label != NULL; label = label->lab_next)
{
@ -657,11 +656,7 @@ dbReComputeBboxFunc(cellDef, boundProc, recurseProc)
}
}
/* Make sure the extended bounding box includes the area of all
* paint material just found, then include the area of all text
* in the current cell.
*/
GeoInclude(&area, &extended);
extended = area;
if (foundAny)
{
for (label = cellDef->cd_labels; label != NULL; label = label->lab_next)
@ -678,7 +673,6 @@ dbReComputeBboxFunc(cellDef, boundProc, recurseProc)
degenerate = TRUE;
area.r_xbot = area.r_ybot = 0;
area.r_xtop = area.r_ytop = 1;
extended = area;
}
else degenerate = FALSE;
@ -693,11 +687,7 @@ dbReComputeBboxFunc(cellDef, boundProc, recurseProc)
if (area.r_ybot == area.r_ytop)
area.r_ytop = area.r_ybot + 1;
if (extended.r_xbot == extended.r_xtop)
extended.r_xtop = extended.r_xbot + 1;
if (extended.r_ybot == extended.r_ytop)
extended.r_ytop = extended.r_ybot + 1;
if (degenerate) extended = area;
/* Did the bounding box change? If not then there's no need to
* recompute the parents. If the cell has no material, then

View File

@ -37,8 +37,9 @@ static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/
#include "windows/windows.h"
#include "dbwind/dbwind.h"
#include "commands/commands.h"
/* C99 compat */
#include "graphics/graphics.h"
#include "cif/CIFint.h"
/*
* The following variable points to the tables currently used for
@ -356,43 +357,9 @@ DBCellCheckCopyAllPaint(scx, mask, xMask, targetUse, func)
struct propUseDefStruct {
CellDef *puds_source;
CellDef *puds_dest;
Plane *puds_plane; /* Mask hint plane in dest */
Transform *puds_trans; /* Transform from source use to dest */
Rect *puds_area; /* Clip area in source coordinates */
};
/*
*-----------------------------------------------------------------------------
*
* dbCopyMaskHintPlaneFunc --
*
* Translate tiles from a child mask-hint property plane into the
* coordinate system of the parent, and paint the mask-hint area
* into the mask-hint property plane of the parent.
*
*-----------------------------------------------------------------------------
*/
int
dbCopyMaskHintPlaneFunc(Tile *tile,
TileType dinfo,
struct propUseDefStruct *puds)
{
Transform *trans = puds->puds_trans;
Rect *clip = puds->puds_area;
Rect r, rnew;
Plane *plane = puds->puds_plane;
TiToRect(tile, &r);
GeoClip(&r, clip);
if (!GEO_RECTNULL(&r))
{
GeoTransRect(trans, &r, &rnew);
DBPaintPlane(plane, &rnew, CIFPaintTable, (PaintUndoInfo *)NULL);
}
return 0;
}
/*
*-----------------------------------------------------------------------------
*
@ -413,52 +380,63 @@ dbCopyMaskHintPlaneFunc(Tile *tile,
*/
int
dbCopyMaskHintsFunc(key, proprec, puds)
dbCopyMaskHintsFunc(key, value, puds)
char *key;
PropertyRecord *proprec;
ClientData value;
struct propUseDefStruct *puds;
{
CellDef *dest = puds->puds_dest;
Transform *trans = puds->puds_trans;
Rect *clip = puds->puds_area;
PropertyRecord *parentproprec, *newproprec;
char *propstr = (char *)value;
char *parentprop, *newvalue, *vptr;
Rect r, rnew;
bool propfound;
int i, j;
if (!strncmp(key, "MASKHINTS_", 10))
{
char *vptr, *lastval;
int lastlen;
Plane *plane;
ASSERT(proprec->prop_type == PROPERTY_TYPE_PLANE, "dbCopyMaskHintsFunc");
/* Append to existing mask hint (if any) */
parentprop = (char *)DBPropGet(dest, key, &propfound);
newvalue = (propfound) ? StrDup((char **)NULL, parentprop) : (char *)NULL;
/* Get the existing mask hint plane in the parent cell, and
* create it if it does not already exist.
*/
parentproprec = (PropertyRecord *)DBPropGet(dest, key, &propfound);
if (propfound)
plane = parentproprec->prop_value.prop_plane;
else
vptr = propstr;
while (*vptr != '\0')
{
newproprec = (PropertyRecord *)mallocMagic(sizeof(PropertyRecord));
newproprec->prop_type = PROPERTY_TYPE_PLANE;
newproprec->prop_len = 0;
plane = DBNewPlane((ClientData)TT_SPACE);
newproprec->prop_value.prop_plane = plane;
DBPropPut(dest, key, newproprec);
}
puds->puds_plane = plane;
if (sscanf(vptr, "%d %d %d %d", &r.r_xbot, &r.r_ybot,
&r.r_xtop, &r.r_ytop) == 4)
{
GeoTransRect(trans, &r, &rnew);
/* Copy the properties from child to parent */
DBSrPaintArea(PlaneGetHint(proprec->prop_value.prop_plane),
proprec->prop_value.prop_plane,
clip, &CIFSolidBits, dbCopyMaskHintPlaneFunc,
(ClientData)puds);
lastval = newvalue;
lastlen = (lastval) ? strlen(lastval) : 0;
newvalue = mallocMagic(40 + lastlen);
if (lastval)
strcpy(newvalue, lastval);
else
*newvalue = '\0';
sprintf(newvalue + lastlen, "%s%d %d %d %d", (lastval) ? " " : "",
rnew.r_xbot, rnew.r_ybot, rnew.r_xtop, rnew.r_ytop);
if (lastval) freeMagic(lastval);
while (*vptr && !isspace(*vptr)) vptr++;
while (*vptr && isspace(*vptr)) vptr++;
while (*vptr && !isspace(*vptr)) vptr++;
while (*vptr && isspace(*vptr)) vptr++;
while (*vptr && !isspace(*vptr)) vptr++;
while (*vptr && isspace(*vptr)) vptr++;
while (*vptr && !isspace(*vptr)) vptr++;
while (*vptr && isspace(*vptr)) vptr++;
}
else break;
}
if (newvalue)
DBPropPut(dest, key, newvalue);
}
return 0;
}
@ -480,17 +458,15 @@ dbCopyMaskHintsFunc(key, proprec, puds)
*-----------------------------------------------------------------------------
*/
void
DBCellCopyMaskHints(child, parent, transform)
DBCellCopyMaskHints(child, parent)
CellUse *child;
CellDef *parent;
Transform *transform;
{
struct propUseDefStruct puds;
puds.puds_source = child->cu_def;
puds.puds_dest = parent;
puds.puds_trans = transform;
puds.puds_area = (Rect *)&TiPlaneRect;
puds.puds_trans = &child->cu_transform;
DBPropEnum(child->cu_def, dbCopyMaskHintsFunc, (ClientData)&puds);
}
@ -524,7 +500,6 @@ dbFlatCopyMaskHintsFunc(scx, def)
puds.puds_source = scx->scx_use->cu_def;
puds.puds_dest = def;
puds.puds_trans = &scx->scx_trans;
puds.puds_area = &scx->scx_area;
DBPropEnum(use->cu_def, dbCopyMaskHintsFunc, (ClientData)&puds);
@ -577,17 +552,15 @@ DBFlatCopyMaskHints(scx, xMask, targetUse)
*/
void
DBFlattenInPlace(use, dest, xMask, dolabels, toplabels, doclear)
DBFlattenInPlace(use, dest, xMask, dolabels, toplabels)
CellUse *use; /* Cell use to flatten */
CellUse *dest; /* Cell use to flatten into */
int xMask; /* Search mask for flattening */
bool dolabels; /* Option to flatten labels */
bool toplabels; /* Option to selectively flatten top-level labels */
bool doclear; /* Delete the original use if TRUE */
{
Label *lab;
SearchContext scx;
int xsep, ysep, xbase, ybase;
if (dest == NULL)
{
@ -596,118 +569,64 @@ DBFlattenInPlace(use, dest, xMask, dolabels, toplabels, doclear)
}
scx.scx_use = use;
scx.scx_trans = use->cu_transform;
scx.scx_area = use->cu_def->cd_bbox;
/* Mark labels in the subcell top level for later handling */
for (lab = scx.scx_use->cu_def->cd_labels; lab; lab = lab->lab_next)
lab->lab_flags |= LABEL_GENERATE;
scx.scx_x = use->cu_xlo;
scx.scx_y = use->cu_ylo;
while (TRUE)
DBCellCopyAllPaint(&scx, &DBAllButSpaceAndDRCBits, xMask, dest);
if (dolabels)
FlatCopyAllLabels(&scx, &DBAllTypeBits, xMask, dest);
else if (toplabels)
{
if ((use->cu_xlo == use->cu_xhi) && (use->cu_ylo == use->cu_yhi))
scx.scx_trans = use->cu_transform;
else
int savemask = scx.scx_use->cu_expandMask;
scx.scx_use->cu_expandMask = CU_DESCEND_SPECIAL;
DBCellCopyAllLabels(&scx, &DBAllTypeBits, CU_DESCEND_SPECIAL, dest);
scx.scx_use->cu_expandMask = savemask;
}
if (xMask != CU_DESCEND_ALL)
DBCellCopyAllCells(&scx, xMask, dest, (Rect *)NULL);
/* Marked labels coming from the subcell top level must not be */
/* ports, and text should be prefixed with the subcell name. */
for (lab = dest->cu_def->cd_labels; lab; lab = lab->lab_next)
{
Label *newlab;
char *newtext;
if (lab->lab_flags & LABEL_GENERATE)
{
if (use->cu_xlo > use->cu_xhi) xsep = -use->cu_xsep;
else xsep = use->cu_xsep;
if (use->cu_ylo > use->cu_yhi) ysep = -use->cu_ysep;
else ysep = use->cu_ysep;
xbase = xsep * (scx.scx_x - use->cu_xlo);
ybase = ysep * (scx.scx_y - use->cu_ylo);
GeoTransTranslate(xbase, ybase, &use->cu_transform, &scx.scx_trans);
}
DBCellCopyAllPaint(&scx, &DBAllButSpaceAndDRCBits, xMask, dest);
if (dolabels)
FlatCopyAllLabels(&scx, &DBAllTypeBits, xMask, dest);
else if (toplabels)
{
int savemask = scx.scx_use->cu_expandMask;
scx.scx_use->cu_expandMask = CU_DESCEND_SPECIAL;
DBCellCopyAllLabels(&scx, &DBAllTypeBits, CU_DESCEND_SPECIAL, dest, NULL);
scx.scx_use->cu_expandMask = savemask;
}
if (xMask != CU_DESCEND_ALL)
DBCellCopyAllCells(&scx, xMask, dest, (Rect *)NULL);
/* Marked labels coming from the subcell top level must not be */
/* ports, and text should be prefixed with the subcell name. */
for (lab = dest->cu_def->cd_labels; lab; lab = lab->lab_next)
{
Label *newlab;
char *newtext;
if (lab->lab_flags & LABEL_GENERATE)
{
newtext = mallocMagic(strlen(lab->lab_text)
newtext = mallocMagic(strlen(lab->lab_text)
+ strlen(scx.scx_use->cu_id) + 2);
if ((use->cu_xlo != use->cu_xhi) && (use->cu_ylo != use->cu_yhi))
sprintf(newtext, "%s[%d][%d]/%s", scx.scx_use->cu_id,
scx.scx_x, scx.scx_y, lab->lab_text);
else if (use->cu_xlo != use->cu_xhi)
sprintf(newtext, "%s[%d]/%s", scx.scx_use->cu_id,
scx.scx_x, lab->lab_text);
else if (use->cu_ylo != use->cu_yhi)
sprintf(newtext, "%s[%d]/%s", scx.scx_use->cu_id,
scx.scx_y, lab->lab_text);
else
sprintf(newtext, "%s/%s", scx.scx_use->cu_id, lab->lab_text);
sprintf(newtext, "%s/%s", scx.scx_use->cu_id, lab->lab_text);
DBPutFontLabel(dest->cu_def,
DBPutFontLabel(dest->cu_def,
&lab->lab_rect, lab->lab_font, lab->lab_size,
lab->lab_rotate, &lab->lab_offset, lab->lab_just,
newtext, lab->lab_type, 0, 0);
DBEraseLabelsByContent(dest->cu_def, &lab->lab_rect,
DBEraseLabelsByContent(dest->cu_def, &lab->lab_rect,
-1, lab->lab_text);
freeMagic(newtext);
}
}
/* Copy and transform mask hints from child to parent */
DBCellCopyMaskHints(scx.scx_use, dest->cu_def, &scx.scx_trans);
/* Stop processing if the use is not arrayed. */
if ((scx.scx_x == use->cu_xhi) && (scx.scx_y == use->cu_yhi))
break;
if (use->cu_xlo < use->cu_xhi)
scx.scx_x++;
else if (use->cu_xlo > use->cu_xhi)
scx.scx_x--;
if (((use->cu_xlo < use->cu_xhi) && (scx.scx_x > use->cu_xhi)) ||
((use->cu_xlo > use->cu_xhi) && (scx.scx_x < use->cu_xhi)))
{
if (use->cu_ylo < use->cu_yhi)
{
scx.scx_y++;
scx.scx_x = use->cu_xlo;
}
else if (use->cu_ylo > use->cu_yhi)
{
scx.scx_y--;
scx.scx_x = use->cu_xlo;
}
freeMagic(newtext);
}
}
/* Unmark labels in the subcell top level */
for (lab = scx.scx_use->cu_def->cd_labels; lab; lab = lab->lab_next)
lab->lab_flags &= ~LABEL_GENERATE;
/* Remove the use from the parent def */
if (doclear)
DBDeleteCell(scx.scx_use);
/* Copy and transform mask hints from child to parent */
DBCellCopyMaskHints(scx.scx_use, dest->cu_def);
/* Was: &scx.scx_use->cu_def->cd_bbox */
DBWAreaChanged(dest->cu_def, &scx.scx_use->cu_bbox,
/* Remove the use from the parent def */
DBDeleteCell(scx.scx_use);
DBWAreaChanged(dest->cu_def, &scx.scx_use->cu_def->cd_bbox,
DBW_ALLWINDOWS, &DBAllButSpaceAndDRCBits);
}
@ -756,7 +675,7 @@ dbCellFlattenCellsFunc(scx, clientData)
toplabels = fad->fad_toplabels;
use = scx->scx_use;
DBFlattenInPlace(use, dest, xMask, dolabels, toplabels, FALSE);
DBFlattenInPlace(use, dest, xMask, dolabels, toplabels);
return 2;
}
@ -991,15 +910,14 @@ DBCellGenerateSimpleSubstrate(scx, subType, notSubMask, targetDef)
*/
int
dbEraseSubFunc(tile, dinfo, cxp)
dbEraseSubFunc(tile, cxp)
Tile *tile; /* Pointer to source tile with shield type */
TileType dinfo; /* Split tile information */
TreeContext *cxp; /* Context from DBTreeSrTiles */
{
SearchContext *scx;
Rect sourceRect, targetRect;
int pNum;
TileType newdinfo, loctype, subType;
TileType type, loctype, subType;
Plane *plane;
struct dbCopySubData *csd; /* Client data */
@ -1008,14 +926,12 @@ dbEraseSubFunc(tile, dinfo, cxp)
plane = csd->csd_plane;
pNum = csd->csd_pNum;
subType = csd->csd_subtype;
type = TiGetTypeExact(tile);
if (IsSplit(tile))
{
loctype = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
loctype = (SplitSide(tile)) ? SplitRightType(tile) : SplitLeftType(tile);
if (loctype == TT_SPACE) return 0;
newdinfo = DBTransformDiagonal(TiGetTypeExact(tile) | dinfo, &scx->scx_trans);
}
else
newdinfo = (TileType)0;
/* Construct the rect for the tile */
TITORECT(tile, &sourceRect);
@ -1025,7 +941,7 @@ dbEraseSubFunc(tile, dinfo, cxp)
csd->csd_modified = TRUE;
return DBNMPaintPlane(plane, newdinfo, &targetRect, DBStdEraseTbl(subType, pNum),
return DBNMPaintPlane(plane, type, &targetRect, DBStdEraseTbl(subType, pNum),
(PaintUndoInfo *)NULL);
}
@ -1037,15 +953,14 @@ dbEraseSubFunc(tile, dinfo, cxp)
*/
int
dbPaintSubFunc(tile, dinfo, cxp)
dbPaintSubFunc(tile, cxp)
Tile *tile; /* Pointer to source tile with shield type */
TileType dinfo; /* Split tile information */
TreeContext *cxp; /* Context from DBTreeSrTiles */
{
SearchContext *scx;
Rect sourceRect, targetRect;
int pNum;
TileType newdinfo, loctype, subType;
TileType type, loctype, subType;
Plane *plane;
struct dbCopySubData *csd; /* Client data */
@ -1054,14 +969,12 @@ dbPaintSubFunc(tile, dinfo, cxp)
plane = csd->csd_plane;
pNum = csd->csd_pNum;
subType = csd->csd_subtype;
type = TiGetTypeExact(tile);
if (IsSplit(tile))
{
loctype = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
loctype = (SplitSide(tile)) ? SplitRightType(tile) : SplitLeftType(tile);
if (loctype == TT_SPACE) return 0;
newdinfo = DBTransformDiagonal(TiGetTypeExact(tile) | dinfo, &scx->scx_trans);
}
else
newdinfo = (TileType)0;
/* Construct the rect for the tile */
TITORECT(tile, &sourceRect);
@ -1071,7 +984,7 @@ dbPaintSubFunc(tile, dinfo, cxp)
csd->csd_modified = TRUE;
return DBNMPaintPlane(plane, newdinfo, &targetRect, DBStdPaintTbl(subType, pNum),
return DBNMPaintPlane(plane, type, &targetRect, DBStdPaintTbl(subType, pNum),
(PaintUndoInfo *)NULL);
}
@ -1084,15 +997,14 @@ dbPaintSubFunc(tile, dinfo, cxp)
*/
int
dbEraseNonSub(tile, dinfo, cxp)
dbEraseNonSub(tile, cxp)
Tile *tile; /* Pointer to tile to erase from target */
TileType dinfo; /* Split tile information */
TreeContext *cxp; /* Context from DBTreeSrTiles */
{
SearchContext *scx;
Rect sourceRect, targetRect;
Plane *plane; /* Plane of target data */
TileType newdinfo, loctype, subType;
TileType type, loctype, subType;
struct dbCopySubData *csd;
int pNum;
@ -1103,14 +1015,12 @@ dbEraseNonSub(tile, dinfo, cxp)
scx = cxp->tc_scx;
type = TiGetTypeExact(tile);
if (IsSplit(tile))
{
loctype = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
loctype = (SplitSide(tile)) ? SplitRightType(tile) : SplitLeftType(tile);
if (loctype == TT_SPACE) return 0;
newdinfo = DBTransformDiagonal(TiGetTypeExact(tile) | dinfo, &scx->scx_trans);
}
else
newdinfo = (TileType)0;
/* Construct the rect for the tile */
TITORECT(tile, &sourceRect);
@ -1119,7 +1029,7 @@ dbEraseNonSub(tile, dinfo, cxp)
GEOTRANSRECT(&scx->scx_trans, &sourceRect, &targetRect);
/* Erase the substrate type from the area of this tile in the target plane. */
return DBNMPaintPlane(plane, newdinfo, &targetRect, DBStdEraseTbl(subType, pNum),
return DBNMPaintPlane(plane, type, &targetRect, DBStdEraseTbl(subType, pNum),
(PaintUndoInfo *)NULL);
}
@ -1131,9 +1041,8 @@ dbEraseNonSub(tile, dinfo, cxp)
*/
int
dbCopySubFunc(tile, dinfo, csd)
dbCopySubFunc(tile, csd)
Tile *tile; /* Pointer to tile to erase from target */
TileType dinfo; /* Split tile information */
struct dbCopySubData *csd; /* Client data */
{
Rect rect;
@ -1143,10 +1052,10 @@ dbCopySubFunc(tile, dinfo, csd)
plane = csd->csd_plane;
pNum = csd->csd_pNum;
type = TiGetTypeExact(tile) | dinfo;
type = TiGetTypeExact(tile);
if (IsSplit(tile))
{
loctype = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
loctype = (SplitSide(tile)) ? SplitRightType(tile) : SplitLeftType(tile);
if (loctype == TT_SPACE) return 0;
}
else
@ -1467,9 +1376,8 @@ DBCellCopyLabels(scx, mask, xMask, targetUse, pArea)
***/
int
dbCopyManhattanPaint(tile, dinfo, cxp)
Tile *tile; /* Pointer to tile to copy */
TileType dinfo; /* Split tile information */
dbCopyManhattanPaint(tile, cxp)
Tile *tile; /* Pointer to tile to copy */
TreeContext *cxp; /* Context from DBTreeSrTiles */
{
SearchContext *scx = cxp->tc_scx;
@ -1515,9 +1423,8 @@ dbCopyManhattanPaint(tile, dinfo, cxp)
***/
int
dbCopyAllPaint(tile, dinfo, cxp)
Tile *tile; /* Pointer to tile to copy */
TileType dinfo; /* Split tile information */
dbCopyAllPaint(tile, cxp)
Tile *tile; /* Pointer to tile to copy */
TreeContext *cxp; /* Context from DBTreeSrTiles */
{
SearchContext *scx = cxp->tc_scx;
@ -1525,7 +1432,7 @@ dbCopyAllPaint(tile, dinfo, cxp)
Rect sourceRect, targetRect;
PaintUndoInfo ui;
CellDef *def;
TileType type = TiGetTypeExact(tile) | dinfo;
TileType type = TiGetTypeExact(tile);
int pNum = cxp->tc_plane;
int result;
TileTypeBitMask *typeMask;
@ -1538,13 +1445,13 @@ dbCopyAllPaint(tile, dinfo, cxp)
*/
bool splittile = FALSE;
TileType newdinfo = 0;
TileType dinfo = 0;
if (IsSplit(tile))
{
splittile = TRUE;
newdinfo = DBTransformDiagonal(type, &scx->scx_trans);
type = (dinfo & TT_SIDE) ? SplitRightType(tile) :
dinfo = DBTransformDiagonal(type, &scx->scx_trans);
type = (SplitSide(tile)) ? SplitRightType(tile) :
SplitLeftType(tile);
}
@ -1604,7 +1511,7 @@ dbCopyAllPaint(tile, dinfo, cxp)
Rect rrect, orect;
int np, i, j;
GrClipTriangle(&targetRect, &arg->caa_rect, TRUE, newdinfo, points, &np);
GrClipTriangle(&targetRect, &arg->caa_rect, TRUE, dinfo, points, &np);
if (np == 0)
return(0);
@ -1633,7 +1540,7 @@ dbCopyAllPaint(tile, dinfo, cxp)
rrect.r_ybot = points[0].p_y;
rrect.r_ytop = points[2].p_y;
GeoCanonicalRect(&rrect, &targetRect);
newdinfo = 0;
dinfo = 0;
}
else if (np >= 4) /* Process extra rectangles in the area */
{
@ -1690,7 +1597,7 @@ topbottom:
splitdone:
result = (*dbCurPaintPlane)(def, pNum, newdinfo | type, &targetRect, &ui);
result = (*dbCurPaintPlane)(def, pNum, dinfo | type, &targetRect, &ui);
if ((result != 0) && (arg->caa_func != NULL))
{
/* result == 1 used exclusively for DRC off-grid error flagging */
@ -1761,8 +1668,7 @@ DBCellCopyAllCells(scx, xMask, targetUse, pArea)
/* dbCellCopyCellsFunc() allows cells to be left with duplicate IDs */
/* so generate unique IDs as needed now. */
if (targetUse != NULL) DBGenerateUniqueIds(targetUse->cu_def, FALSE);
DBGenerateUniqueIds(targetUse->cu_def, FALSE);
}
/*

View File

@ -117,14 +117,6 @@ DBCellRename(cellname, newname, doforce)
return FALSE;
}
/* Cannot rename a cell with the name of an existing cell */
entry = HashLookOnly(&dbCellDefTable, newname);
if (entry != NULL)
{
TxError("Cannot rename; cell \"%s\" already exists!\n", newname);
return FALSE;
}
/* Disallow renaming if the cell has the READONLY flag set, */
/* because the cellname must match the name in the GDS */
/* file referenced. */
@ -152,9 +144,10 @@ DBCellRename(cellname, newname, doforce)
if (doforce && ((celldef->cd_flags & CDVENDORGDS) == CDVENDORGDS))
{
char *chkgdsfile;
bool isReadOnly;
DBPropGet(celldef, "GDS_FILE", &isReadOnly);
chkgdsfile = (char *)DBPropGet(celldef, "GDS_FILE", &isReadOnly);
/* Note that clearing GDS_FILE will also clear CDVENDORGDS flag */
if (isReadOnly) DBPropPut(celldef, "GDS_FILE", NULL);
@ -231,7 +224,7 @@ DBCellDelete(cellname, force)
{
HashEntry *entry;
CellDef *celldef;
CellUse *celluse, *lastuse;
CellUse *celluse;
bool result;
entry = HashLookOnly(&dbCellDefTable, cellname);
@ -266,36 +259,13 @@ DBCellDelete(cellname, force)
return FALSE;
}
/* 2nd pass: If there are instances of the cell in */
/* internal cells like SelectDef, etc., then remove the use */
/* from the definition. */
lastuse = NULL;
celluse = celldef->cd_parents;
while (celluse != (CellUse *) NULL)
{
if (celluse->cu_parent != (CellDef *)NULL)
{
if ((celluse->cu_parent->cd_flags & CDINTERNAL) == CDINTERNAL)
{
DBDeleteCell(celluse);
celluse = lastuse;
}
}
lastuse = celluse;
if (lastuse == NULL)
celluse = celldef->cd_parents;
else
celluse = celluse->cu_nextuse;
}
/* Cleared to delete. . . now prompt user if the cell has changes. */
/* Last chance to save! */
if ((force == FALSE) &&
(celldef->cd_flags & (CDMODIFIED|CDBOXESCHANGED|CDSTAMPSCHANGED)))
{
static const char *yesno[] = { "no", "yes", 0 };
static char *yesno[] = { "no", "yes", 0 };
int code;
char *prompt = TxPrintString("Cell %s has been modified.\n Do you"
" want to delete it and lose all changes? ",
@ -313,13 +283,12 @@ DBCellDelete(cellname, force)
/* so that WindUnload() will create a new one. */
if (!strcmp(cellname, UNNAMED))
DBCellRename(cellname, "__UNNAMED__", FALSE);
DBCellRename(cellname, "__UNNAMED__");
/* For all top-level cell uses, check if any windows have this */
/* use. If so, load the window with (UNNAMED). */
UndoDisable();
free_magic1_t mm1 = freeMagic1_init();
for (celluse = celldef->cd_parents; celluse != (CellUse *) NULL;
celluse = celluse->cu_nextuse)
{
@ -328,9 +297,8 @@ DBCellDelete(cellname, force)
WindUnload(celluse);
freeMagic(celluse->cu_id);
}
freeMagic1(&mm1, (char *)celluse);
freeMagic((char *)celluse);
}
freeMagic1_end(&mm1);
celldef->cd_parents = (CellUse *)NULL;
DBWResetBox(celldef);
@ -400,12 +368,6 @@ dbGetUseName(celluse)
ybuf[0] = '\0';
useID = celluse->cu_id;
if (useID == NULL)
{
newID = (char *)mallocMagic(7);
sprintf(newID, "(null)");
return (newID);
}
newsize = strlen(useID) + 1;
if (isx || isy)
{
@ -1159,13 +1121,11 @@ DBUsePrint(CellName, who, dolist)
celldef = DBCellLookDef(CellName);
*lasthier = '/';
}
else if (EditCellUse != NULL)
else
{
/* Referenced cellDef is the current edit def */
celldef = EditCellUse->cu_def;
}
else
return;
switch (who)
{
@ -1347,7 +1307,7 @@ DBLockUse(UseName, bval)
while( (entry = HashNext(&dbCellDefTable, &hs)) != NULL)
{
celldef = (CellDef *) HashGetValue(entry);
if ((celldef != (CellDef *)NULL) && !(celldef->cd_flags & CDINTERNAL))
if (celldef != (CellDef *) NULL)
{
celluse = celldef->cd_parents; /* only need one */
if (celluse != (CellUse *)NULL) {
@ -1426,7 +1386,7 @@ DBOrientUse(UseName, dodef)
while( (entry = HashNext(&dbCellDefTable, &hs)) != NULL)
{
celldef = (CellDef *) HashGetValue(entry);
if ((celldef != (CellDef *)NULL) && !(celldef->cd_flags & CDINTERNAL))
if (celldef != (CellDef *) NULL)
{
celluse = celldef->cd_parents; /* only need one */
if (celluse != (CellUse *)NULL) {
@ -1589,7 +1549,7 @@ DBAbutmentUse(UseName, dolist)
while( (entry = HashNext(&dbCellDefTable, &hs)) != NULL)
{
celldef = (CellDef *) HashGetValue(entry);
if ((celldef != (CellDef *)NULL) && !(celldef->cd_flags & CDINTERNAL))
if (celldef != (CellDef *) NULL)
{
celluse = celldef->cd_parents; /* only need one */
if (celluse != (CellUse *)NULL) {
@ -1619,9 +1579,7 @@ dbAbutmentUseFunc(selUse, use, transform, data)
{
Rect bbox, refbox;
Transform *trans;
PropertyRecord *proprec;
char *propvalue;
char *refllx, *reflly, *refurx, *refury;
bool found;
bool *dolist = (bool *)data;
@ -1643,47 +1601,32 @@ dbAbutmentUseFunc(selUse, use, transform, data)
}
trans = &use->cu_transform;
proprec = DBPropGet(use->cu_def, "FIXED_BBOX", &found);
propvalue = DBPropGet(use->cu_def, "FIXED_BBOX", &found);
if (!found)
bbox = use->cu_def->cd_bbox;
else
{
if ((proprec->prop_type == PROPERTY_TYPE_DIMENSION) &&
(proprec->prop_len == 4))
{
bbox.r_xbot = proprec->prop_value.prop_integer[0];
bbox.r_ybot = proprec->prop_value.prop_integer[1];
bbox.r_xtop = proprec->prop_value.prop_integer[2];
bbox.r_ytop = proprec->prop_value.prop_integer[3];
}
else
{
TxError("Unable to parse the cell's FIXED_BBOX property; using "
"the instance bounding box instead.\n");
if (sscanf(propvalue, "%d %d %d %d", &bbox.r_xbot, &bbox.r_ybot,
&bbox.r_xtop, &bbox.r_ytop) != 4)
bbox = use->cu_def->cd_bbox;
}
}
GeoTransRect(trans, &bbox, &refbox);
/* NOTE: Ideally, the MagWindow pointer should get passed to this routine */
refllx = DBWPrintValue(refbox.r_xbot, (MagWindow *)NULL, TRUE);
reflly = DBWPrintValue(refbox.r_ybot, (MagWindow *)NULL, FALSE);
refurx = DBWPrintValue(refbox.r_xtop, (MagWindow *)NULL, TRUE);
refury = DBWPrintValue(refbox.r_ytop, (MagWindow *)NULL, FALSE);
#ifdef MAGIC_WRAPPER
if (*dolist)
{
pobj = Tcl_NewListObj(0, NULL);
Tcl_ListObjAppendElement(magicinterp, pobj, Tcl_NewStringObj(refllx, -1));
Tcl_ListObjAppendElement(magicinterp, pobj, Tcl_NewStringObj(reflly, -1));
Tcl_ListObjAppendElement(magicinterp, pobj, Tcl_NewStringObj(refurx, -1));
Tcl_ListObjAppendElement(magicinterp, pobj, Tcl_NewStringObj(refury, -1));
Tcl_ListObjAppendElement(magicinterp, pobj, Tcl_NewIntObj(refbox.r_xbot));
Tcl_ListObjAppendElement(magicinterp, pobj, Tcl_NewIntObj(refbox.r_ybot));
Tcl_ListObjAppendElement(magicinterp, pobj, Tcl_NewIntObj(refbox.r_xtop));
Tcl_ListObjAppendElement(magicinterp, pobj, Tcl_NewIntObj(refbox.r_ytop));
Tcl_SetObjResult(magicinterp, pobj);
}
else
#endif
TxPrintf("Abutment box: %s %s %s %s\n", refllx, reflly, refurx, refury);
TxPrintf("Abutment box: %d %d %d %d\n", refbox.r_xbot, refbox.r_ybot,
refbox.r_xtop, refbox.r_ytop);
return 0;
}
@ -1755,7 +1698,7 @@ DBCellNewDef(cellName)
cellName = UNNAMED;
entry = HashFind(&dbCellDefTable, cellName);
if (HashGetValue(entry) != NULL)
if (HashGetValue(entry) != (ClientData) NULL)
return ((CellDef *) NULL);
cellDef = DBCellDefAlloc();
@ -1916,7 +1859,7 @@ DBCellRenameDef(cellDef, newName)
ASSERT(HashGetValue(oldEntry) == (ClientData) cellDef, "DBCellRenameDef");
newEntry = HashFind(&dbCellDefTable, newName);
if (HashGetValue(newEntry) != NULL)
if (HashGetValue(newEntry) != (ClientData) NULL)
return (FALSE);
HashSetValue(oldEntry, (ClientData) NULL);
@ -1962,7 +1905,6 @@ DBCellDeleteDef(cellDef)
entry = HashFind(&dbCellDefTable, cellDef->cd_name);
ASSERT(HashGetValue(entry) == (ClientData) cellDef, "DBCellDeleteDef");
HashSetValue(entry, (ClientData) NULL);
HashRemove(&dbCellDefTable, cellDef->cd_name);
if (cellDef->cd_props)
DBPropClearAll(cellDef);
@ -2024,10 +1966,8 @@ DBCellDefFree(cellDef)
cellDef->cd_planes[pNum] = (Plane *) NULL;
}
free_magic1_t mm1 = freeMagic1_init();
for (lab = cellDef->cd_labels; lab; lab = lab->lab_next)
freeMagic1(&mm1, (char *) lab);
freeMagic1_end(&mm1);
freeMagic((char *) lab);
SigEnableInterrupts();
HashKill(&cellDef->cd_idHash);
@ -2354,14 +2294,8 @@ DBFindUse(id, parentDef)
he = HashLookOnly(&parentDef->cd_idHash, id);
if (delimit != NULL) *delimit = '[';
if (he == NULL)
{
/* Try again without ignoring the delimiter */
if (delimit != NULL)
he = HashLookOnly(&parentDef->cd_idHash, id);
return (CellUse *) NULL;
if (he == NULL)
return (CellUse *) NULL;
}
return (CellUse *) HashGetValue(he);
}
@ -2409,50 +2343,6 @@ DBGenerateUniqueIds(def, warn)
HashKill(&dbUniqueNameTable);
}
/*
* ----------------------------------------------------------------------------
*
* DBSelectionUniqueIds --
*
* This is similar to DBGenerateUniqueIds(), but the purpose is to make
* sure that cell IDs in the selection do not collide with IDs in the
* definition. This is done before copying from Select2Def back to the
* root edit CellDef. Otherwise, any copied cell takes the name of the
* original, and the original gets renamed, which is unexpected behavior.
* Called only from SelectCopy().
*
* Results:
* None.
*
* Side effects:
* May modify the use-id's of the cells in the cell plane of 'selDef'.
*
* ----------------------------------------------------------------------------
*/
void
DBSelectionUniqueIds(selDef, rootDef)
CellDef *selDef; /* Should be Select2Def */
CellDef *rootDef; /* Should be EditRootDef */
{
int dbFindNamesFunc();
int dbGenerateUniqueIdsFunc();
dbWarnUniqueIds = FALSE;
HashInit(&dbUniqueDefTable, 32, 1); /* Indexed by (CellDef *) */
HashInit(&dbUniqueNameTable, 32, 0); /* Indexed by use-id */
/* Build up tables of names */
DBCellEnum(rootDef, dbFindNamesFunc, (ClientData) rootDef);
DBCellEnum(selDef, dbFindNamesFunc, (ClientData) selDef);
/* Assign unique use-ids to all cells in the selection */
DBCellEnum(selDef, dbGenerateUniqueIdsFunc, (ClientData) selDef);
HashKill(&dbUniqueDefTable);
HashKill(&dbUniqueNameTable);
}
/*
* ----------------------------------------------------------------------------
*
@ -2611,7 +2501,7 @@ DBUnLinkCell(use, parentDef)
{
HashEntry *he;
if ((he = HashLookOnly(&parentDef->cd_idHash, use->cu_id)))
if (he = HashLookOnly(&parentDef->cd_idHash, use->cu_id))
HashSetValue(he, (ClientData) NULL);
}
@ -2629,7 +2519,7 @@ DBUnLinkCell(use, parentDef)
* Side effects:
* Fills in *pydef with a newly created CellDef by that name, and
* *pyuse with a newly created CellUse pointing to the new def.
* The CellDef pointed to by *pydef has the CDINTERNAL flag
* The CellDef pointed to by *pydef has the CD_INTERNAL flag
* set, and is marked as being available.
*
* ----------------------------------------------------------------------------

View File

@ -83,18 +83,16 @@ struct seeTypesArg
*/
int
DBSrCellPlaneArea(BPlane *plane, const Rect *rect, int (*func)(), ClientData arg)
DBSrCellPlaneArea(BPlane *plane, Rect *rect, int (*func)(), ClientData arg)
{
BPEnum sbpe;
BPEnum *bpe;
CellUse *use;
int rval = 0;
/* bpe = (BPEnum *)mallocMagic(sizeof(BPEnum)); */
bpe = &sbpe;
bpe = (BPEnum *)mallocMagic(sizeof(BPEnum));
BPEnumInit(bpe, plane, rect, BPE_OVERLAP, "DBSrCellPlaneArea");
while ((use = BPEnumNext(bpe)))
while (use = BPEnumNext(bpe))
{
if ((*func)(use, arg))
{
@ -104,7 +102,7 @@ DBSrCellPlaneArea(BPlane *plane, const Rect *rect, int (*func)(), ClientData arg
}
BPEnumTerm(bpe);
/* freeMagic(bpe); */
freeMagic(bpe);
return rval;
}
@ -120,7 +118,6 @@ DBSrCellPlaneArea(BPlane *plane, const Rect *rect, int (*func)(), ClientData arg
* int
* func(tile, cxp)
* Tile *tile;
* TileType dinfo;
* TreeContext *cxp;
* {
* }
@ -245,8 +242,10 @@ dbCellPlaneSrFunc(scx, fp)
if (!DBDescendSubcell(scx->scx_use, fp->tf_xmask))
return 0;
if ((def->cd_flags & CDAVAILABLE) == 0)
if (!DBCellRead(def, TRUE, TRUE, NULL))
return 0;
{
bool dereference = (def->cd_flags & CDDEREFERENCE) ? TRUE : FALSE;
if (!DBCellRead(def, (char *) NULL, TRUE, dereference, NULL)) return 0;
}
context.tc_scx = scx;
context.tc_filter = fp;
@ -365,8 +364,10 @@ dbCellUniqueTileSrFunc(scx, fp)
if (!DBDescendSubcell(scx->scx_use, fp->tf_xmask))
return 0;
if ((def->cd_flags & CDAVAILABLE) == 0)
if (!DBCellRead(def, TRUE, TRUE, NULL))
return 0;
{
bool dereference = (def->cd_flags & CDDEREFERENCE) ? TRUE : FALSE;
if (!DBCellRead(def, (char *) NULL, TRUE, dereference, NULL)) return 0;
}
context.tc_scx = scx;
context.tc_filter = fp;
@ -417,7 +418,6 @@ dbCellUniqueTileSrFunc(scx, fp)
* int
* func(tile, cxp)
* Tile *tile;
* TileType dinfo;
* TreeContext *cxp;
* {
* }
@ -476,8 +476,10 @@ DBNoTreeSrTiles(scx, mask, xMask, func, cdarg)
return 0;
if ((def->cd_flags & CDAVAILABLE) == 0)
if (!DBCellRead(def, TRUE, TRUE, NULL))
return 0;
{
bool dereference = (def->cd_flags & CDDEREFERENCE) ? TRUE : FALSE;
if (!DBCellRead(def, (char *) NULL, TRUE, dereference, NULL)) return 0;
}
filter.tf_func = func;
filter.tf_arg = cdarg;
@ -585,26 +587,9 @@ DBTreeSrLabels(scx, mask, xMask, tpath, flags, func, cdarg)
ASSERT(def != (CellDef *) NULL, "DBTreeSrLabels");
if (!DBDescendSubcell(cellUse, xMask)) return 0;
if ((def->cd_flags & CDAVAILABLE) == 0)
if (!DBCellRead(def, TRUE, TRUE, NULL))
return 0;
if (flags & TF_LABEL_REVERSE_SEARCH)
{
/* Search children first */
filter.tf_func = func;
filter.tf_arg = cdarg;
filter.tf_mask = mask;
filter.tf_xmask = xMask;
filter.tf_tpath = tpath;
filter.tf_flags = flags;
scx2 = *scx;
if (scx2.scx_area.r_xbot > TiPlaneRect.r_xbot) scx2.scx_area.r_xbot -= 1;
if (scx2.scx_area.r_ybot > TiPlaneRect.r_ybot) scx2.scx_area.r_ybot -= 1;
if (scx2.scx_area.r_xtop < TiPlaneRect.r_xtop) scx2.scx_area.r_xtop += 1;
if (scx2.scx_area.r_ytop < TiPlaneRect.r_ytop) scx2.scx_area.r_ytop += 1;
if (DBCellSrArea(&scx2, dbCellLabelSrFunc, (ClientData) &filter))
return 1;
bool dereference = (def->cd_flags & CDDEREFERENCE) ? TRUE : FALSE;
if (!DBCellRead(def, (char *) NULL, TRUE, dereference, NULL)) return 0;
}
for (lab = def->cd_labels; lab; lab = lab->lab_next)
@ -642,8 +627,8 @@ DBTreeSrLabels(scx, mask, xMask, tpath, flags, func, cdarg)
r1.r_ybot = r->r_ytop;
r2.r_xbot = r->r_xtop;
}
is_touching = GEO_TOUCH(&lab->lab_rect, &r1) ||
GEO_TOUCH(&lab->lab_rect, &r2);
is_touching = GEO_TOUCH(&lab->lab_bbox, &r1) ||
GEO_TOUCH(&lab->lab_bbox, &r2);
}
else
is_touching = GEO_TOUCH(&lab->lab_rect, r);
@ -659,8 +644,6 @@ DBTreeSrLabels(scx, mask, xMask, tpath, flags, func, cdarg)
return (1);
}
if (flags & TF_LABEL_REVERSE_SEARCH) return 0; /* children already searched */
filter.tf_func = func;
filter.tf_arg = cdarg;
filter.tf_mask = mask;
@ -702,7 +685,7 @@ dbCellLabelSrFunc(scx, fp)
{
Label *lab;
Rect *r = &scx->scx_area;
const TileTypeBitMask *mask = fp->tf_mask;
TileTypeBitMask *mask = fp->tf_mask;
CellDef *def = scx->scx_use->cu_def;
char *tnext;
int result;
@ -711,8 +694,10 @@ dbCellLabelSrFunc(scx, fp)
ASSERT(def != (CellDef *) NULL, "dbCellLabelSrFunc");
if (!DBDescendSubcell(scx->scx_use, fp->tf_xmask)) return 0;
if ((def->cd_flags & CDAVAILABLE) == 0)
if (!DBCellRead(def, TRUE, TRUE, NULL))
return 0;
{
bool dereference = (def->cd_flags & CDDEREFERENCE) ? TRUE : FALSE;
if (!DBCellRead(def, (char *) NULL, TRUE, dereference, NULL)) return 0;
}
/* Do not add a path name of a top level window */
if (strncmp(scx->scx_use->cu_id, "Topmost ", 8))
@ -732,16 +717,6 @@ dbCellLabelSrFunc(scx, fp)
}
}
/* If fp->tf_flags has TF_LABEL_REVERSE_SEARCH, then search child
* uses first, then the parent. This is for display, so that if
* a child cell and parent cell have overlapping labels, the parent
* label is the one on top.
*/
if (fp->tf_flags & TF_LABEL_REVERSE_SEARCH)
if (DBCellSrArea(scx, dbCellLabelSrFunc, (ClientData) fp))
result = 1;
/* Apply the function first to any of the labels in this def. */
result = 0;
@ -763,11 +738,9 @@ dbCellLabelSrFunc(scx, fp)
}
}
/* Now visit each child use recursively, if not doing a reverse search */
if (!(fp->tf_flags & TF_LABEL_REVERSE_SEARCH))
if (DBCellSrArea(scx, dbCellLabelSrFunc, (ClientData) fp))
result = 1;
/* Now visit each child use recursively */
if (DBCellSrArea(scx, dbCellLabelSrFunc, (ClientData) fp))
result = 1;
cleanup:
/* Remove the trailing pathname component from the TerminalPath */
@ -845,8 +818,11 @@ DBTreeSrCells(scx, xMask, func, cdarg)
if (!DBDescendSubcell(cellUse, xMask))
return 0;
if ((cellUse->cu_def->cd_flags & CDAVAILABLE) == 0)
if (!DBCellRead(cellUse->cu_def, TRUE, TRUE, NULL))
{
bool dereference = (cellUse->cu_def->cd_flags & CDDEREFERENCE) ? TRUE : FALSE;
if (!DBCellRead(cellUse->cu_def, (char *) NULL, TRUE, dereference, NULL))
return 0;
}
context.tc_scx = scx;
context.tc_filter = &filter;
@ -890,8 +866,11 @@ dbTreeCellSrFunc(scx, fp)
else
{
if ((use->cu_def->cd_flags & CDAVAILABLE) == 0)
if (!DBCellRead(use->cu_def, TRUE, TRUE, NULL))
{
bool dereference = (use->cu_def->cd_flags & CDDEREFERENCE) ? TRUE : FALSE;
if (!DBCellRead(use->cu_def, (char *) NULL, TRUE, dereference, NULL))
return 0;
}
}
if (fp->tf_xmask == CU_DESCEND_ALL)
{
@ -949,9 +928,8 @@ DBSeeTypesAll(rootUse, rootRect, xMask, mask)
*/
int
dbSeeTypesAllSrFunc(tile, dinfo, cxp)
dbSeeTypesAllSrFunc(tile, cxp)
Tile *tile;
TileType dinfo;
TreeContext *cxp;
{
Rect tileRect;
@ -962,7 +940,7 @@ dbSeeTypesAllSrFunc(tile, dinfo, cxp)
if (GEO_OVERLAP((&tileRect), area))
{
if (IsSplit(tile))
TTMaskSetType(mask, (dinfo & TT_SIDE) ?
TTMaskSetType(mask, SplitSide(tile) ?
SplitRightType(tile) : SplitLeftType(tile));
else
TTMaskSetType(mask, TiGetType(tile));
@ -1148,8 +1126,12 @@ DBCellSrArea(scx, func, cdarg)
context.tc_scx = scx;
if ((scx->scx_use->cu_def->cd_flags & CDAVAILABLE) == 0)
if (!DBCellRead(scx->scx_use->cu_def, TRUE, TRUE, NULL))
{
bool dereference = (scx->scx_use->cu_def->cd_flags & CDDEREFERENCE) ?
TRUE : FALSE;
if (!DBCellRead(scx->scx_use->cu_def, (char *) NULL, TRUE, dereference, NULL))
return 0;
}
if (DBSrCellPlaneArea(scx->scx_use->cu_def->cd_cellPlane,
&scx->scx_area, dbCellSrFunc, (ClientData) &context))
@ -1271,9 +1253,10 @@ DBCellEnum(cellDef, func, cdarg)
filter.tf_func = func;
filter.tf_arg = cdarg;
if ((cellDef->cd_flags & CDAVAILABLE) == 0)
if (!DBCellRead(cellDef, TRUE, TRUE, NULL))
return 0;
{
bool dereference = (cellDef->cd_flags & CDDEREFERENCE) ? TRUE : FALSE;
if (!DBCellRead(cellDef, (char *) NULL, TRUE, dereference, NULL)) return 0;
}
if (DBSrCellPlaneArea(cellDef->cd_cellPlane,
&TiPlaneRect, dbEnumFunc, (ClientData) &filter))
return 1;
@ -1552,22 +1535,19 @@ DBScaleEverything(scalen, scaled)
}
/* Free the linked CellDef list */
free_magic1_t mm1 = freeMagic1_init();
lcd = lhead;
while (lcd != NULL)
{
freeMagic1(&mm1, (char *)lcd);
freeMagic((char *)lcd);
lcd = lcd->cd_next;
}
freeMagic1_end(&mm1);
/* Scale all elements */
DBWScaleElements(scalen, scaled);
#ifdef ROUTE_MODULE
/* Recovery of global plane pointers */
MZAttachHintPlanes();
#endif
/* Modify root box */
ToolScaleBox(scalen, scaled);
@ -1643,9 +1623,8 @@ dbScalePlane(oldplane, newplane, pnum, scalen, scaled, doCIF)
*/
int
dbTileScaleFunc(tile, dinfo, scvals)
dbTileScaleFunc(tile, scvals)
Tile *tile;
TileType dinfo;
struct scaleArg *scvals;
{
TileType type;
@ -1663,20 +1642,17 @@ dbTileScaleFunc(tile, dinfo, scvals)
if ((targetRect.r_xtop - targetRect.r_xbot == 0) ||
(targetRect.r_ytop - targetRect.r_ybot == 0))
{
TxPrintf("Tile %p at (%d, %d) has zero area after scaling: Removed.\n",
(void *) tile, targetRect.r_xbot, targetRect.r_ybot);
TxPrintf("Tile 0x%x at (%d, %d) has zero area after scaling: Removed.\n",
tile, targetRect.r_xbot, targetRect.r_ybot);
return 0;
}
type = TiGetTypeExact(tile) | dinfo;
type = TiGetTypeExact(tile);
exact = type;
if (IsSplit(tile))
type = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
type = (SplitSide(tile)) ? SplitRightType(tile) : SplitLeftType(tile);
DBNMPaintPlane(scvals->ptarget, exact, &targetRect,
(
#ifdef CIF_MODULE
(scvals->doCIF) ? CIFPaintTable :
#endif
((scvals->doCIF) ? CIFPaintTable :
DBStdPaintTbl(type, scvals->pnum)),
(PaintUndoInfo *)NULL);
return 0;
@ -1726,9 +1702,8 @@ dbMovePlane(oldplane, newplane, pnum, origx, origy)
*/
int
dbTileMoveFunc(tile, dinfo, mvvals)
dbTileMoveFunc(tile, mvvals)
Tile *tile;
TileType dinfo;
struct moveArg *mvvals;
{
TileType type;
@ -1741,12 +1716,12 @@ dbTileMoveFunc(tile, dinfo, mvvals)
DBMovePoint(&targetRect.r_ll, mvvals->origx, mvvals->origy);
DBMovePoint(&targetRect.r_ur, mvvals->origx, mvvals->origy);
type = TiGetTypeExact(tile) | dinfo;
type = TiGetTypeExact(tile);
exact = type;
if (IsSplit(tile))
type = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
type = (SplitSide(tile)) ? SplitRightType(tile) : SplitLeftType(tile);
DBNMPaintPlane(mvvals->ptarget, exact, &targetRect,
(mvvals->pnum < 0) ? CIFPaintTable : DBStdPaintTbl(type, mvvals->pnum),
DBStdPaintTbl(type, mvvals->pnum),
(PaintUndoInfo *)NULL);
return 0;
}
@ -1808,14 +1783,12 @@ DBSrCellUses(cellDef, func, arg)
}
/* Free this linked cellUse structure */
free_magic1_t mm1 = freeMagic1_init();
lu = luhead;
while (lu != NULL)
{
freeMagic1(&mm1, (char *)lu);
freeMagic((char *)lu);
lu = lu->cu_next;
}
freeMagic1_end(&mm1);
return retval;
}
@ -1839,48 +1812,84 @@ typedef struct _cellpropstruct {
* ----------------------------------------------------------------------------
*/
int dbScaleProp(name, proprec, cps)
int dbScaleProp(name, value, cps)
char *name;
PropertyRecord *proprec;
char *value;
CellPropStruct *cps;
{
int i, scalen, scaled;
Point p;
int scalen, scaled;
char *newvalue, *vptr;
Rect r;
/* Only "dimension" and "plane" type properties get scaled */
if (proprec->prop_type == PROPERTY_TYPE_PLANE)
if ((strlen(name) > 5) && !strncmp(name + strlen(name) - 5, "_BBOX", 5))
{
Plane *newplane;
newplane = DBNewPlane((ClientData)TT_SPACE);
DBClearPaintPlane(newplane);
/* Plane index is unused; arbitrarily substitute -1 */
dbScalePlane(proprec->prop_value.prop_plane, newplane, -1,
scalen, scaled, TRUE);
DBFreePaintPlane(proprec->prop_value.prop_plane);
TiFreePlane(proprec->prop_value.prop_plane);
proprec->prop_value.prop_plane = newplane;
return 0;
if (sscanf(value, "%d %d %d %d", &r.r_xbot, &r.r_ybot,
&r.r_xtop, &r.r_ytop) == 4)
{
/* Scale numerator held in point X value, */
/* scale denominator held in point Y value */
scalen = cps->cps_point.p_x;
scaled = cps->cps_point.p_y;
DBScalePoint(&r.r_ll, scalen, scaled);
DBScalePoint(&r.r_ur, scalen, scaled);
newvalue = (char *)mallocMagic(40);
sprintf(newvalue, "%d %d %d %d", r.r_xbot, r.r_ybot,
r.r_xtop, r.r_ytop);
DBPropPut(cps->cps_def, name, newvalue);
}
}
if (proprec->prop_type != PROPERTY_TYPE_DIMENSION) return 0;
/* Scale numerator held in point X value, */
/* scale denominator held in point Y value */
scalen = cps->cps_point.p_x;
scaled = cps->cps_point.p_y;
for (i = 0; i < proprec->prop_len; i += 2)
else if (!strncmp(name, "MASKHINTS_", 10))
{
if ((i + 1) >= proprec->prop_len) break;
char *vptr, *lastval;
int lastlen;
p.p_x = proprec->prop_value.prop_integer[i];
p.p_y = proprec->prop_value.prop_integer[i + 1];
DBScalePoint(&p, scalen, scaled);
proprec->prop_value.prop_integer[i] = p.p_x;
proprec->prop_value.prop_integer[i + 1] = p.p_y;
newvalue = (char *)NULL;
vptr = value;
while (*vptr != '\0')
{
if (sscanf(vptr, "%d %d %d %d", &r.r_xbot, &r.r_ybot,
&r.r_xtop, &r.r_ytop) == 4)
{
/* Scale numerator held in point X value, */
/* scale denominator held in point Y value */
scalen = cps->cps_point.p_x;
scaled = cps->cps_point.p_y;
DBScalePoint(&r.r_ll, scalen, scaled);
DBScalePoint(&r.r_ur, scalen, scaled);
lastval = newvalue;
lastlen = (lastval) ? strlen(lastval) : 0;
newvalue = mallocMagic(40 + lastlen);
if (lastval)
strcpy(newvalue, lastval);
else
*newvalue = '\0';
sprintf(newvalue + lastlen, "%s%d %d %d %d", (lastval) ? " " : "",
r.r_xbot, r.r_ybot, r.r_xtop, r.r_ytop);
if (lastval) freeMagic(lastval);
/* Parse through the four values and check if there's more */
while (*vptr && !isspace(*vptr)) vptr++;
while (*vptr && isspace(*vptr)) vptr++;
while (*vptr && !isspace(*vptr)) vptr++;
while (*vptr && isspace(*vptr)) vptr++;
while (*vptr && !isspace(*vptr)) vptr++;
while (*vptr && isspace(*vptr)) vptr++;
while (*vptr && !isspace(*vptr)) vptr++;
while (*vptr && isspace(*vptr)) vptr++;
}
else break;
}
if (newvalue)
DBPropPut(cps->cps_def, name, newvalue);
}
return 0; /* Keep enumerating through properties */
}
@ -1896,47 +1905,33 @@ int dbScaleProp(name, proprec, cps)
* ----------------------------------------------------------------------------
*/
int dbMoveProp(name, proprec, cps)
int dbMoveProp(name, value, cps)
char *name;
PropertyRecord *proprec;
char *value;
CellPropStruct *cps;
{
int i, origx, origy;
int origx, origy;
char *newvalue;
Point p;
Rect r;
/* Only "dimension" and "plane" type properties get scaled */
if (proprec->prop_type == PROPERTY_TYPE_PLANE)
if (((strlen(name) > 5) && !strncmp(name + strlen(name) - 5, "_BBOX", 5))
|| !strncmp(name, "MASKHINTS_", 10))
{
Plane *newplane;
if (sscanf(value, "%d %d %d %d", &r.r_xbot, &r.r_ybot,
&r.r_xtop, &r.r_ytop) == 4)
{
origx = cps->cps_point.p_x;
origy = cps->cps_point.p_y;
newplane = DBNewPlane((ClientData) TT_SPACE);
DBClearPaintPlane(newplane);
/* Use plane index -1 to indicate use of CIFPaintTable */
dbMovePlane(proprec->prop_value.prop_plane, newplane, -1, origx, origy);
DBFreePaintPlane(proprec->prop_value.prop_plane);
TiFreePlane(proprec->prop_value.prop_plane);
proprec->prop_value.prop_plane = newplane;
return 0;
DBMovePoint(&r.r_ll, origx, origy);
DBMovePoint(&r.r_ur, origx, origy);
newvalue = (char *)mallocMagic(40);
sprintf(newvalue, "%d %d %d %d", r.r_xbot, r.r_ybot,
r.r_xtop, r.r_ytop);
DBPropPut(cps->cps_def, name, newvalue);
}
}
if (proprec->prop_type != PROPERTY_TYPE_DIMENSION) return 0;
origx = cps->cps_point.p_x;
origy = cps->cps_point.p_y;
for (i = 0; i < proprec->prop_len; i += 2)
{
if ((i + 1) >= proprec->prop_len) break;
p.p_x = proprec->prop_value.prop_integer[i];
p.p_y = proprec->prop_value.prop_integer[i + 1];
DBMovePoint(&p, origx, origy);
proprec->prop_value.prop_integer[i] = p.p_x;
proprec->prop_value.prop_integer[i + 1] = p.p_y;
}
return 0; /* Keep enumerating through properties */
}
@ -2021,14 +2016,12 @@ dbScaleCell(cellDef, scalen, scaled)
BPFree(cellPlaneOrig);
/* Free this linked cellUse structure */
free_magic1_t mm1 = freeMagic1_init();
lu = luhead;
while (lu != NULL)
{
freeMagic1(&mm1, (char *)lu);
freeMagic((char *)lu);
lu = lu->cu_next;
}
freeMagic1_end(&mm1);
/* Scale all of the paint tiles in this cell by creating a new plane */
/* and copying all tiles into the new plane at scaled dimensions. */
@ -2080,16 +2073,38 @@ donecell:
DBScalePoint(&cellDef->cd_extended.r_ll, scalen, scaled);
DBScalePoint(&cellDef->cd_extended.r_ur, scalen, scaled);
/* If the cell is an abstract view with a fixed bounding box, then */
/* adjust the bounding box property to match the new scale. */
if ((cellDef->cd_flags & CDFIXEDBBOX) != 0)
{
Rect r;
bool found;
char *propval;
propval = (char *)DBPropGet(cellDef, "FIXED_BBOX", &found);
if (found)
{
if (sscanf(propval, "%d %d %d %d", &r.r_xbot, &r.r_ybot,
&r.r_xtop, &r.r_ytop) == 4)
{
DBScalePoint(&r.r_ll, scalen, scaled);
DBScalePoint(&r.r_ur, scalen, scaled);
propval = (char *)mallocMagic(40);
sprintf(propval, "%d %d %d %d", r.r_xbot, r.r_ybot,
r.r_xtop, r.r_ytop);
DBPropPut(cellDef, "FIXED_BBOX", propval);
}
}
}
/* Check all properties for ones with keys beginning with "MASKHINTS_"
* or ending with "_BBOX", and scale them by the same amount as all
* the geometry.
*
* Note: This would be better handled if there were a special type
* for properties which are coordinates; currently the only property
* type is a string, thus requiring the string to be parsed every time
* the coordinates are needed.
*/
cps.cps_point.p_x = scalen;
cps.cps_point.p_y = scaled;
cps.cps_def = cellDef;
@ -2231,14 +2246,12 @@ DBMoveCell(cellDef, origx, origy)
BPFree(cellPlaneOrig);
/* Free this linked cellUse structure */
free_magic1_t mm1 = freeMagic1_init();
lu = luhead;
while (lu != NULL)
{
freeMagic1(&mm1, (char *)lu);
freeMagic((char *)lu);
lu = lu->cu_next;
}
freeMagic1_end(&mm1);
/* Move all of the paint tiles in this cell by creating a new plane */
/* and copying all tiles into the new plane at the new position. */
@ -2249,7 +2262,7 @@ DBMoveCell(cellDef, origx, origy)
newplane = DBNewPlane((ClientData) TT_SPACE);
DBClearPaintPlane(newplane);
if (dbMovePlane(cellDef->cd_planes[pNum], newplane, pNum,
origx, origy))
origx, origy, FALSE))
cellDef->cd_flags |= (CDMODIFIED | CDGETNEWSTAMP);
DBFreePaintPlane(cellDef->cd_planes[pNum]);
TiFreePlane(cellDef->cd_planes[pNum]);

View File

@ -76,9 +76,12 @@ DBDescendSubcell(use, xMask)
case CU_DESCEND_NO_SUBCKT:
if ((use->cu_def->cd_flags & CDAVAILABLE) == 0)
if (!DBCellRead(use->cu_def, TRUE, TRUE, NULL))
{
bool dereference = (use->cu_def->cd_flags & CDDEREFERENCE) ?
TRUE : FALSE;
if (!DBCellRead(use->cu_def, (char *) NULL, TRUE, dereference, NULL))
return FALSE;
}
return (DBIsSubcircuit(use->cu_def)) ? FALSE : TRUE;
case CU_DESCEND_NO_LOCK:
@ -218,10 +221,8 @@ DBCellClearDef(cellDef)
cellDef->cd_bbox.r_xtop = cellDef->cd_bbox.r_ytop = 1;
cellDef->cd_extended.r_xbot = cellDef->cd_extended.r_ybot = 0;
cellDef->cd_extended.r_xtop = cellDef->cd_extended.r_ytop = 1;
free_magic1_t mm1 = freeMagic1_init();
for (lab = cellDef->cd_labels; lab; lab = lab->lab_next)
freeMagic1(&mm1, (char *) lab);
freeMagic1_end(&mm1);
freeMagic((char *) lab);
cellDef->cd_labels = (Label *) NULL;
cellDef->cd_lastLabel = (Label *) NULL;
@ -264,7 +265,7 @@ DBClearPaintPlane(plane)
/* Allocate a new central space tile */
newCenterTile = TiAlloc();
PlaneSetHint(plane, newCenterTile);
plane->pl_hint = newCenterTile;
TiSetBody(newCenterTile, TT_SPACE);
dbSetPlaneTile(plane, newCenterTile);
}

View File

@ -128,6 +128,86 @@ DBInvTransformDiagonal(oldtype, trans)
return dinfo;
}
/*
* ----------------------------------------------------------------------------
*
* DBSrConnectOnePlane --
*
* Search from a starting tile to find all paint that is electrically
* connected to that tile in the same plane.
*
* Results:
* 0 is returned if the search finished normally. 1 is returned
* if the search was aborted.
*
* Side effects:
* For every paint tile that is electrically connected to the initial
* tile, func is called. Func should have the following form:
*
* int
* func(tile, clientData)
* Tile *tile;
* ClientData clientData;
* {
* }
*
* The clientData passed to func is the same one that was passed
* to us. Func returns 0 under normal conditions; if it returns
* 1 then the search is aborted.
*
* *** WARNING ***
*
* Func should not modify any paint during the search, since this
* will mess up pointers kept by these procedures and likely cause
* a core-dump.
*
* ----------------------------------------------------------------------------
*/
int
DBSrConnectOnePlane(startTile, connect, func, clientData)
Tile *startTile; /* Starting tile for search */
TileTypeBitMask *connect; /* Pointer to a table indicating what tile
* types connect to what other tile types.
* Each entry gives a mask of types that
* connect to tiles of a given type.
*/
int (*func)(); /* Function to apply at each connected tile. */
ClientData clientData; /* Client data for above function. */
{
struct conSrArg csa;
int result;
extern int dbSrConnectFunc(); /* Forward declaration. */
result = 0;
csa.csa_def = (CellDef *)NULL;
csa.csa_bounds = TiPlaneRect;
/* Pass 1. During this pass the client function gets called. */
csa.csa_clientFunc = func;
csa.csa_clientData = clientData;
csa.csa_clientDefault = startTile->ti_client;
csa.csa_clear = FALSE;
csa.csa_connect = connect;
csa.csa_pNum = -1;
if (dbSrConnectFunc(startTile, &csa) != 0) result = 1;
/* Pass 2. Don't call any client function, just clear the marks.
* Don't allow any interruptions.
*/
SigDisableInterrupts();
csa.csa_clientFunc = NULL;
csa.csa_clear = TRUE;
(void) dbSrConnectFunc(startTile, &csa);
SigEnableInterrupts();
return result;
}
/*
* ----------------------------------------------------------------------------
*
@ -197,7 +277,9 @@ DBSrConnect(def, startArea, mask, connect, bounds, func, clientData)
{
struct conSrArg csa;
int startPlane, result;
TileAndDinfo start_tad; /* Starting tile and split information */
Tile *startTile; /* Starting tile for search. */
extern int dbSrConnectFunc(); /* Forward declaration. */
extern int dbSrConnectStartFunc();
result = 0;
csa.csa_def = def;
@ -208,18 +290,17 @@ DBSrConnect(def, startArea, mask, connect, bounds, func, clientData)
* the tile address and returns.
*/
start_tad.tad_tile = NULL;
start_tad.tad_next = NULL; /* unused */
startTile = NULL;
for (startPlane = PL_TECHDEPBASE; startPlane < DBNumPlanes; startPlane++)
{
csa.csa_pNum = startPlane;
if (DBSrPaintArea((Tile *) NULL,
def->cd_planes[startPlane], startArea, mask,
dbSrConnectStartFunc, PTR2CD(&start_tad)) != 0) break;
dbSrConnectStartFunc, (ClientData) &startTile) != 0) break;
}
if (start_tad.tad_tile == NULL) return 0;
if (startTile == NULL) return 0;
/* The following lets us call DBSrConnect recursively */
else if (start_tad.tad_tile->ti_client == (ClientData)1) return 0;
else if (startTile->ti_client == (ClientData)1) return 0;
/* Pass 1. During this pass the client function gets called. */
@ -228,8 +309,7 @@ DBSrConnect(def, startArea, mask, connect, bounds, func, clientData)
csa.csa_clientDefault = CLIENTDEFAULT;
csa.csa_clear = FALSE;
csa.csa_connect = connect;
if (dbSrConnectFunc(start_tad.tad_tile, start_tad.tad_dinfo,
PTR2CD(&csa)) != 0) result = 1;
if (dbSrConnectFunc(startTile, &csa) != 0) result = 1;
/* Pass 2. Don't call any client function, just clear the marks.
* Don't allow any interruptions.
@ -238,22 +318,18 @@ DBSrConnect(def, startArea, mask, connect, bounds, func, clientData)
SigDisableInterrupts();
csa.csa_clientFunc = NULL;
csa.csa_clear = TRUE;
(void) dbSrConnectFunc(start_tad.tad_tile, start_tad.tad_dinfo, PTR2CD(&csa));
(void) dbSrConnectFunc(startTile, &csa);
SigEnableInterrupts();
return result;
}
/** @typedef cb_database_srpaintarea_t */
int
dbSrConnectStartFunc(
Tile *tile, /* This will be the starting tile. */
TileType dinfo, /* (unused) */
ClientData cdata) /* We store tile and split info here. */
dbSrConnectStartFunc(tile, pTile)
Tile *tile; /* This will be the starting tile. */
Tile **pTile; /* We store tile's address here. */
{
TileAndDinfo *tad = (TileAndDinfo *)CD2PTR(cdata);
tad->tad_tile = tile;
tad->tad_dinfo = dinfo;
*pTile = tile;
return 1;
}
@ -291,7 +367,9 @@ DBSrConnectOnePass(def, startArea, mask, connect, bounds, func, clientData)
{
struct conSrArg csa;
int startPlane, result;
TileAndDinfo tad;
Tile *startTile; /* Starting tile for search. */
extern int dbSrConnectFunc(); /* Forward declaration. */
extern int dbSrConnectStartFunc();
result = 0;
csa.csa_def = def;
@ -302,18 +380,17 @@ DBSrConnectOnePass(def, startArea, mask, connect, bounds, func, clientData)
* the tile address and returns.
*/
tad.tad_tile = NULL;
tad.tad_next = NULL; /* unused */
startTile = NULL;
for (startPlane = PL_TECHDEPBASE; startPlane < DBNumPlanes; startPlane++)
{
csa.csa_pNum = startPlane;
if (DBSrPaintArea((Tile *) NULL,
def->cd_planes[startPlane], startArea, mask,
dbSrConnectStartFunc, PTR2CD(&tad)) != 0) break;
dbSrConnectStartFunc, (ClientData) &startTile) != 0) break;
}
if (tad.tad_tile == NULL) return 0;
if (startTile == NULL) return 0;
/* The following lets us call DBSrConnect recursively */
else if (tad.tad_tile->ti_client == (ClientData)1) return 0;
else if (startTile->ti_client == (ClientData)1) return 0;
/* Pass 1. During this pass the client function gets called. */
@ -322,7 +399,7 @@ DBSrConnectOnePass(def, startArea, mask, connect, bounds, func, clientData)
csa.csa_clientDefault = CLIENTDEFAULT;
csa.csa_clear = FALSE;
csa.csa_connect = connect;
if (dbSrConnectFunc(tad.tad_tile, tad.tad_dinfo, PTR2CD(&csa)) != 0) result = 1;
if (dbSrConnectFunc(startTile, &csa) != 0) result = 1;
return result;
}
@ -345,15 +422,12 @@ DBSrConnectOnePass(def, startArea, mask, connect, bounds, func, clientData)
*/
int
dbcFindTileFunc(tile, dinfo, arg)
dbcFindTileFunc(tile, arg)
Tile *tile;
TileType dinfo;
ClientData arg;
{
TileAndDinfo *tad = (TileAndDinfo *)arg;
tad->tad_tile = tile;
tad->tad_dinfo = dinfo;
Tile **tptr = (Tile **)arg;
*tptr = tile;
return 1;
}
@ -391,19 +465,16 @@ dbcFindTileFunc(tile, dinfo, arg)
*/
int
dbSrConnectFunc(
Tile *tile, /* Tile that is connected. */
TileType dinfo, /* Split tile information */
ClientData cdata) /* Contains information about the search. */
/* (struct conSrArg *csa) */
dbSrConnectFunc(tile, csa)
Tile *tile; /* Tile that is connected. */
struct conSrArg *csa; /* Contains information about the search. */
{
struct conSrArg *csa = (struct conSrArg *)CD2PTR(cdata);
Tile *t2;
Rect tileArea;
int i, pNum;
int result = 0;
bool callClient;
const TileTypeBitMask *connectMask;
TileTypeBitMask *connectMask;
TileType loctype, checktype;
PlaneMask planes;
@ -412,15 +483,13 @@ dbSrConnectFunc(
/* Drop the first entry on the stack */
pNum = csa->csa_pNum;
STACKPUSH(INT2CD(tile), dbConnectStack);
STACKPUSH(INT2CD(dinfo), dbConnectStack);
STACKPUSH(INT2CD(pNum), dbConnectStack);
STACKPUSH((ClientData)tile, dbConnectStack);
STACKPUSH((ClientData)pNum, dbConnectStack);
while (!StackEmpty(dbConnectStack))
{
pNum = (int)CD2INT(STACKPOP(dbConnectStack));
dinfo = (int)CD2INT(STACKPOP(dbConnectStack));
tile = (Tile *)CD2INT(STACKPOP(dbConnectStack));
pNum = (int)STACKPOP(dbConnectStack);
tile = (Tile *)STACKPOP(dbConnectStack);
if (result == 1) continue;
TiToRect(tile, &tileArea);
@ -453,7 +522,7 @@ dbSrConnectFunc(
if (callClient && (csa->csa_clientFunc != NULL))
{
if ((*csa->csa_clientFunc)(tile, dinfo, pNum, csa->csa_clientData) != 0)
if ((*csa->csa_clientFunc)(tile, pNum, csa->csa_clientData) != 0)
{
result = 1;
continue;
@ -467,7 +536,7 @@ dbSrConnectFunc(
if (IsSplit(tile))
{
if (dinfo & TT_SIDE)
if (SplitSide(tile))
loctype = SplitRightType(tile);
else
loctype = SplitLeftType(tile);
@ -478,7 +547,7 @@ dbSrConnectFunc(
/* Left side: */
if (IsSplit(tile) && (dinfo & TT_SIDE)) goto bottomside;
if (IsSplit(tile) && SplitSide(tile)) goto bottomside;
for (t2 = BL(tile); BOTTOM(t2) < tileArea.r_ytop; t2 = RT(t2))
{
@ -495,19 +564,17 @@ dbSrConnectFunc(
if (t2->ti_client == csa->csa_clientDefault) continue;
}
else if (t2->ti_client == (ClientData) 1) continue;
STACKPUSH(INT2CD(t2), dbConnectStack);
if (IsSplit(t2))
STACKPUSH(INT2CD((TileType)TT_SIDE), dbConnectStack);
else
STACKPUSH(INT2CD(0), dbConnectStack);
STACKPUSH(INT2CD(pNum), dbConnectStack);
TiSetBody(t2, (ClientData)(t2->ti_body | TT_SIDE)); /* bit set */
STACKPUSH((ClientData)t2, dbConnectStack);
STACKPUSH((ClientData)pNum, dbConnectStack);
}
}
/* Bottom side: */
bottomside:
if (IsSplit(tile) && ((!((dinfo & TT_SIDE) ? 1 : 0)) ^ SplitDirection(tile)))
if (IsSplit(tile) && (!(SplitSide(tile) ^ SplitDirection(tile))))
goto rightside;
for (t2 = LB(tile); LEFT(t2) < tileArea.r_xtop; t2 = TR(t2))
@ -525,25 +592,24 @@ bottomside:
if (t2->ti_client == csa->csa_clientDefault) continue;
}
else if (t2->ti_client == (ClientData) 1) continue;
STACKPUSH(INT2CD(t2), dbConnectStack);
if (IsSplit(t2))
{
if (SplitDirection(t2))
STACKPUSH(INT2CD((TileType)TT_SIDE), dbConnectStack);
/* bit set */
TiSetBody(t2, (ClientData)(t2->ti_body | TT_SIDE));
else
/* bit clear */
STACKPUSH(INT2CD(0), dbConnectStack);
TiSetBody(t2, (ClientData)(t2->ti_body & ~TT_SIDE));
}
else
STACKPUSH(INT2CD(0), dbConnectStack);
STACKPUSH(INT2CD(pNum), dbConnectStack);
STACKPUSH((ClientData)t2, dbConnectStack);
STACKPUSH((ClientData)pNum, dbConnectStack);
}
}
/* Right side: */
rightside:
if (IsSplit(tile) && !(dinfo & TT_SIDE)) goto topside;
if (IsSplit(tile) && !SplitSide(tile)) goto topside;
for (t2 = TR(tile); ; t2 = LB(t2))
{
@ -560,9 +626,10 @@ rightside:
if (t2->ti_client == csa->csa_clientDefault) goto nextRight;
}
else if (t2->ti_client == (ClientData) 1) goto nextRight;
STACKPUSH(INT2CD(t2), dbConnectStack);
STACKPUSH(INT2CD(0), dbConnectStack);
STACKPUSH(INT2CD(pNum), dbConnectStack);
if (IsSplit(t2))
TiSetBody(t2, (ClientData)(t2->ti_body & ~TT_SIDE)); /* bit clear */
STACKPUSH((ClientData)t2, dbConnectStack);
STACKPUSH((ClientData)pNum, dbConnectStack);
}
nextRight: if (BOTTOM(t2) <= tileArea.r_ybot) break;
}
@ -570,8 +637,7 @@ rightside:
/* Top side: */
topside:
if (IsSplit(tile) && (((dinfo & TT_SIDE) ? 1 : 0) ^ SplitDirection(tile)))
goto donesides;
if (IsSplit(tile) && (SplitSide(tile) ^ SplitDirection(tile))) goto donesides;
for (t2 = RT(tile); ; t2 = BL(t2))
{
@ -588,19 +654,17 @@ topside:
if (t2->ti_client == csa->csa_clientDefault) goto nextTop;
}
else if (t2->ti_client == (ClientData) 1) goto nextTop;
STACKPUSH(INT2CD(t2), dbConnectStack);
if (IsSplit(t2))
{
if (SplitDirection(t2))
/* bit clear */
STACKPUSH(INT2CD(0), dbConnectStack);
TiSetBody(t2, (ClientData)(t2->ti_body & ~TT_SIDE));
else
/* bit set */
STACKPUSH(INT2CD((TileType)TT_SIDE), dbConnectStack);
TiSetBody(t2, (ClientData)(t2->ti_body | TT_SIDE));
}
else
STACKPUSH(INT2CD(0), dbConnectStack);
STACKPUSH(INT2CD(pNum), dbConnectStack);
STACKPUSH((ClientData)t2, dbConnectStack);
STACKPUSH((ClientData)pNum, dbConnectStack);
}
nextTop: if (LEFT(t2) <= tileArea.r_xbot) break;
}
@ -618,7 +682,6 @@ donesides:
{
Rect newArea;
GEO_EXPAND(&tileArea, 1, &newArea);
TileAndDinfo tad;
for (i = PL_TECHDEPBASE; i < DBNumPlanes; i++)
{
@ -626,21 +689,19 @@ donesides:
if (IsSplit(tile))
{
if (DBSrPaintNMArea((Tile *) NULL, csa->csa_def->cd_planes[i],
TiGetTypeExact(tile) | dinfo, &newArea, connectMask,
dbcFindTileFunc, (ClientData)&tad) != 0)
TiGetTypeExact(tile), &newArea, connectMask,
dbcFindTileFunc, (ClientData)&t2) != 0)
{
STACKPUSH(PTR2CD(tad.tad_tile), dbConnectStack);
STACKPUSH(INT2CD(tad.tad_dinfo), dbConnectStack);
STACKPUSH(INT2CD(i), dbConnectStack);
STACKPUSH((ClientData)t2, dbConnectStack);
STACKPUSH((ClientData)i, dbConnectStack);
}
}
else if (DBSrPaintArea((Tile *) NULL, csa->csa_def->cd_planes[i],
&newArea, connectMask, dbcFindTileFunc,
(ClientData)&tad) != 0)
(ClientData)&t2) != 0)
{
STACKPUSH(PTR2CD(tad.tad_tile), dbConnectStack);
STACKPUSH(INT2CD(tad.tad_dinfo), dbConnectStack);
STACKPUSH(INT2CD(i), dbConnectStack);
STACKPUSH((ClientData)t2, dbConnectStack);
STACKPUSH((ClientData)i, dbConnectStack);
}
}
}
@ -670,13 +731,10 @@ donesides:
* ----------------------------------------------------------------------------
*/
/** @typedef cb_database_srpaintnmarea_t */
/** @typedef cb_database_srpaintarea_t */
int
dbcUnconnectFunc(tile, dinfo, clientData)
dbcUnconnectFunc(tile, clientData)
Tile *tile; /* Current tile */
TileType dinfo; /* Split tile information, unused */
ClientData clientData; /* Unused. */
ClientData clientData; /* Unused. */
{
return 1;
@ -768,8 +826,7 @@ dbcConnectLabelFunc(scx, lab, tpath, csa2)
CellDef *orig_def = scx->scx_use->cu_def;
Label *slab;
int lidx = lab->lab_port;
bool foundOne;
const TileTypeBitMask *connectMask;
TileTypeBitMask *connectMask;
/* Check for equivalent ports. For any found, call */
/* DBTreeSrTiles recursively on the type and area */
@ -780,7 +837,6 @@ dbcConnectLabelFunc(scx, lab, tpath, csa2)
/* are more equivalent ports, they will be found when */
/* processing this label's area. */
foundOne = FALSE;
for (slab = orig_def->cd_labels; slab != NULL; slab = slab->lab_next)
if ((slab->lab_flags & PORT_DIR_MASK) && (slab != lab))
if (slab->lab_port == lidx)
@ -799,13 +855,10 @@ dbcConnectLabelFunc(scx, lab, tpath, csa2)
connectMask = &csa2->csa2_connect[slab->lab_type];
pNum = DBPlane(slab->lab_type);
// Do *not* run this check on zero area labels
if (!GEO_RECTNULL(&newarea))
if (DBSrPaintArea((Tile *) NULL, def->cd_planes[pNum],
if (DBSrPaintArea((Tile *) NULL, def->cd_planes[pNum],
&newarea, connectMask, dbcUnconnectFunc,
(ClientData) NULL) == 1)
continue;
continue;
newarea.r_xbot--;
newarea.r_xtop++;
@ -841,20 +894,6 @@ dbcConnectLabelFunc(scx, lab, tpath, csa2)
csa2->csa2_list[csa2->csa2_top].connectMask = connectMask;
csa2->csa2_list[csa2->csa2_top].dinfo = 0;
#if 0
/* This warning is useful but currently is generating
* multiple messages per instance and so its more of
* an annoyance than an aid.
*/
if (foundOne == FALSE)
TxError("Warning: Port %s at location (%d %d) connects"
" a net across multiple disconnected areas!\n",
lab->lab_text, lab->lab_rect.r_xbot,
lab->lab_rect.r_ybot);
#endif
foundOne = TRUE;
/* See above: Process only one equivalent port at a time */
break;
}
@ -889,9 +928,8 @@ dbcConnectLabelFunc(scx, lab, tpath, csa2)
*/
int
dbcConnectFunc(tile, dinfo, cx)
dbcConnectFunc(tile, cx)
Tile *tile; /* Tile found. */
TileType dinfo; /* Split tile information */
TreeContext *cx; /* Describes context of search. The client
* data is a pointer to a conSrArg2 record
* containing various required information.
@ -899,13 +937,12 @@ dbcConnectFunc(tile, dinfo, cx)
{
struct conSrArg2 *csa2;
Rect tileArea, newarea;
const TileTypeBitMask *connectMask;
TileTypeBitMask notConnectMask;
TileTypeBitMask *connectMask, notConnectMask;
Rect *srArea;
SearchContext *scx = cx->tc_scx;
SearchContext scx2;
TileType loctype = TiGetTypeExact(tile) | dinfo;
TileType newdinfo = 0;
TileType loctype = TiGetTypeExact(tile);
TileType dinfo = 0;
int retval, i, pNum = cx->tc_plane;
CellDef *def;
@ -937,8 +974,8 @@ dbcConnectFunc(tile, dinfo, cx)
if (IsSplit(tile))
{
newdinfo = DBTransformDiagonal(loctype, &scx->scx_trans);
loctype = ((dinfo & TT_SIDE)) ? SplitRightType(tile) : SplitLeftType(tile);
dinfo = DBTransformDiagonal(loctype, &scx->scx_trans);
loctype = (SplitSide(tile)) ? SplitRightType(tile) : SplitLeftType(tile);
}
/* See if the destination cell contains stuff over the whole
@ -976,7 +1013,7 @@ dbcConnectFunc(tile, dinfo, cx)
def = csa2->csa2_use->cu_def;
retval = 1;
if (DBSrPaintNMArea((Tile *) NULL, def->cd_planes[pNum],
newdinfo, &newarea, &notConnectMask, dbcUnconnectFunc,
dinfo, &newarea, &notConnectMask, dbcUnconnectFunc,
(ClientData) NULL) == 0)
retval = 0;
@ -985,7 +1022,8 @@ dbcConnectFunc(tile, dinfo, cx)
* the storage for the current list element.
*/
DBNMPaintPlane(def->cd_planes[pNum], newdinfo,
if ((retval == 1) || DBIsContact(loctype))
DBNMPaintPlane(def->cd_planes[pNum], dinfo,
&newarea, DBStdPaintTbl(loctype, pNum),
(PaintUndoInfo *) NULL);
@ -1002,14 +1040,14 @@ dbcConnectFunc(tile, dinfo, cx)
/* Only extend those sides bordering the diagonal tile */
if (newdinfo & TT_DIAGONAL)
if (dinfo & TT_DIAGONAL)
{
if (newdinfo & TT_SIDE) /* right */
if (dinfo & TT_SIDE) /* right */
newarea.r_xtop += 1;
else /* left */
newarea.r_xbot -= 1;
if (((newdinfo & TT_SIDE) >> 1)
== (newdinfo & TT_DIRECTION)) /* top */
if (((dinfo & TT_SIDE) >> 1)
== (dinfo & TT_DIRECTION)) /* top */
newarea.r_ytop += 1;
else /* bottom */
newarea.r_ybot -= 1;
@ -1037,13 +1075,7 @@ dbcConnectFunc(tile, dinfo, cx)
if (++csa2->csa2_top == CSA2_LIST_SIZE)
{
/* Reached list size limit---need to push the list and */
/* start a new one. NOTE: Setting lasttop to -1 means */
/* that some entries may be duplicated between the */
/* stacks, which is a small inefficiency. In theory, */
/* lasttop could be left as is, then if lasttop > top */
/* when searching the last 5 entries, pop the stack, do */
/* the search, and then push the stack again. But it's */
/* a lot easier just to be slightly inefficient. */
/* start a new one. */
conSrArea *newlist;
@ -1051,12 +1083,11 @@ dbcConnectFunc(tile, dinfo, cx)
StackPush((ClientData)csa2->csa2_list, csa2->csa2_stack);
csa2->csa2_list = newlist;
csa2->csa2_top = 0;
csa2->csa2_lasttop = -1;
}
csa2->csa2_list[csa2->csa2_top].area = newarea;
csa2->csa2_list[csa2->csa2_top].connectMask = connectMask;
csa2->csa2_list[csa2->csa2_top].dinfo = newdinfo;
csa2->csa2_list[csa2->csa2_top].dinfo = dinfo;
return 0;
}
@ -1122,7 +1153,7 @@ DBTreeCopyConnect(scx, mask, xMask, connect, area, doLabels, destUse)
*/
{
struct conSrArg2 csa2;
const TileTypeBitMask *newmask;
TileTypeBitMask *newmask;
TileType newtype;
unsigned char searchtype;
@ -1211,8 +1242,7 @@ DBTreeCopyConnect(scx, mask, xMask, connect, area, doLabels, destUse)
if (DBTreeSrLabels(scx, newmask, xMask, &tpath, searchtype,
dbcConnectLabelFunc, (ClientData) &csa2) != 0)
{
TxError("Connection search was interrupted or hit "
"memory limit and stopped.\n");
TxError("Connection search hit memory limit and stopped.\n");
break;
}
}

View File

@ -50,13 +50,12 @@ static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/
* cell graph; if it returns 0 then the subcells of 'def' are visited;
* if it returns 1 then the subcells are not visited.
*
* void
* int
* hiercount(parent, uses, child, cdata)
* CellDef *parent;
* CellDef *parent, *child;
* int uses; /# Scale factor: number of times child
* # is used by parent
* #/
* CellDef *child;
* ClientData cdata;
* {
* }
@ -104,7 +103,7 @@ static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/
struct countArg
{
int (*ca_count)();
void (*ca_hiercount)();
int (*ca_hiercount)();
ClientData ca_cdata;
};
@ -112,7 +111,7 @@ void
DBTreeCountPaint(def, count, hiercount, cleanup, cdata)
CellDef *def;
int (*count)();
void (*hiercount)();
int (*hiercount)();
int (*cleanup)();
ClientData cdata;
{

View File

@ -39,7 +39,6 @@ struct expandArg
{
bool ea_deref; /* TRUE if root def dereference flag is set */
int ea_xmask; /* Expand mask. */
int ea_type; /* Expand, unexpand, or toggle */
int (*ea_func)(); /* Function to call for each cell whose
* status is changed.
*/
@ -68,29 +67,23 @@ struct expandArg
*/
void
DBExpand(cellUse, expandMask, expandType)
DBExpand(cellUse, expandMask, expandFlag)
CellUse *cellUse;
int expandMask;
int expandType;
bool expandFlag;
{
CellDef *def;
bool expandFlag, expandTest;
expandTest = DBDescendSubcell(cellUse, expandMask);
if ((expandType & DB_EXPAND_MASK) == DB_EXPAND_TOGGLE)
expandFlag = expandTest;
else
{
expandFlag = ((expandType & DB_EXPAND_MASK) == DB_EXPAND) ? TRUE : FALSE;
if (expandFlag == expandTest) return;
}
if (DBDescendSubcell(cellUse, expandMask) == expandFlag)
return;
if (expandFlag)
{
def = cellUse->cu_def;
if ((def->cd_flags & CDAVAILABLE) == 0)
{
if (!DBCellRead(def, TRUE, TRUE, NULL))
bool dereference = (def->cd_flags & CDDEREFERENCE) ? TRUE : FALSE;
if (!DBCellRead(def, (char *) NULL, TRUE, dereference, NULL))
return;
/* Note: we don't have to recompute the bbox here, because
* if it changed, then a timestamp violation must have occurred
@ -138,44 +131,51 @@ DBExpand(cellUse, expandMask, expandType)
*/
void
DBExpandAll(rootUse, rootRect, expandMask, expandType, func, cdarg)
DBExpandAll(rootUse, rootRect, expandMask, expandFlag, func, cdarg)
CellUse *rootUse; /* Root cell use from which search begins */
Rect *rootRect; /* Area to be expanded, in root coordinates */
int expandMask; /* Window mask in which cell is to be expanded */
int expandType; /* DB_EXPAND, DB_UNEXPAND, DB_EXPAND_TOGGLE */
bool expandFlag; /* TRUE => expand, FALSE => unexpand */
int (*func)(); /* Function to call for each cell whose expansion
* status is modified. NULL means don't call anyone.
*/
ClientData cdarg; /* Argument to pass to func. */
{
int dbExpandFunc();
int dbExpandFunc(), dbUnexpandFunc();
SearchContext scontext;
struct expandArg arg;
bool dereference = (rootUse->cu_def->cd_flags & CDDEREFERENCE) ?
TRUE : FALSE;
if ((rootUse->cu_def->cd_flags & CDAVAILABLE) == 0)
(void) DBCellRead(rootUse->cu_def, TRUE, TRUE, NULL);
{
(void) DBCellRead(rootUse->cu_def, (char *) NULL, TRUE, dereference, NULL);
}
/*
* Walk through the area and set the expansion state appropriately.
* Walk through the area and set the expansion state
* appropriately.
*/
arg.ea_xmask = expandMask;
arg.ea_func = func;
arg.ea_arg = cdarg;
arg.ea_type = expandType;
arg.ea_deref = (rootUse->cu_def->cd_flags & CDDEREFERENCE) ? TRUE : FALSE;
arg.ea_deref = dereference;
scontext.scx_use = rootUse;
scontext.scx_trans = GeoIdentityTransform;
scontext.scx_area = *rootRect;
DBCellSrArea(&scontext, dbExpandFunc, (ClientData) &arg);
if (expandFlag)
DBCellSrArea(&scontext, dbExpandFunc, (ClientData) &arg);
else
DBCellSrArea(&scontext, dbUnexpandFunc, (ClientData) &arg);
}
/*
* dbExpandFunc --
*
* Filter function called by DBCellSrArea on behalf of DBExpandAll above
* when cells are being expanded, unexpanded, or toggled.
* when cells are being expanded.
*/
int
@ -189,55 +189,64 @@ dbExpandFunc(scx, arg)
{
CellUse *childUse = scx->scx_use;
int n = DBLambda[1];
int expandTest;
int expandType = (arg->ea_type & DB_EXPAND_MASK);
int expandSurround = (arg->ea_type & DB_EXPAND_SURROUND_MASK);
bool surround;
expandTest = DBDescendSubcell(childUse, arg->ea_xmask);
/*
* Change the expansion status of this cell if necessary. Call the
* client's function if the expansion status has changed.
*/
if (!expandTest && ((expandType == DB_EXPAND) || (expandType == DB_EXPAND_TOGGLE)))
if (!DBDescendSubcell(childUse, arg->ea_xmask))
{
surround = (!GEO_SURROUND(&childUse->cu_def->cd_bbox, &scx->scx_area)
|| GEO_SURROUND(&scx->scx_area, &childUse->cu_def->cd_bbox));
if (surround || (expandSurround == DB_EXPAND_OVERLAP))
{
/* If the cell is unavailable, then don't expand it.
*/
if ((childUse->cu_def->cd_flags & CDAVAILABLE) == 0)
/* If the cell is unavailable, then don't expand it.
*/
if ((childUse->cu_def->cd_flags & CDAVAILABLE) == 0)
if(!DBCellRead(childUse->cu_def, (char *) NULL, TRUE, arg->ea_deref, NULL))
{
/* If the parent is dereferenced, then the child should be, too */
if (arg->ea_deref) childUse->cu_def->cd_flags |= CDDEREFERENCE;
if (!DBCellRead(childUse->cu_def, TRUE, TRUE, NULL))
{
TxError("Cell %s is unavailable. It could not be expanded.\n",
childUse->cu_def->cd_name);
return 2;
}
TxError("Cell %s is unavailable. It could not be expanded.\n",
childUse->cu_def->cd_name);
return 2;
}
childUse->cu_expandMask |= arg->ea_xmask;
expandTest = TRUE;
if (arg->ea_func != NULL)
{
if ((*arg->ea_func)(childUse, arg->ea_arg) != 0) return 1;
}
childUse->cu_expandMask |= arg->ea_xmask;
if (arg->ea_func != NULL)
{
if ((*arg->ea_func)(childUse, arg->ea_arg) != 0) return 1;
}
}
else if (expandTest && ((expandType == DB_UNEXPAND) ||
(expandType == DB_EXPAND_TOGGLE)))
if (DBCellSrArea(scx, dbExpandFunc, (ClientData) arg))
return 1;
return 2;
}
/*
* dbUnexpandFunc --
*
* Filter function called by DBCellSrArea on behalf of DBExpandAll above
* when cells are being unexpanded.
*/
int
dbUnexpandFunc(scx, arg)
SearchContext *scx; /* Pointer to search context containing
* child use, search area in coor-
* dinates of the child use, and
* transform back to "root".
*/
struct expandArg *arg; /* Client data from caller */
{
CellUse *childUse = scx->scx_use;
/*
* Change the expansion status of this cell if necessary.
*/
if (DBDescendSubcell(childUse, arg->ea_xmask))
{
surround = (!GEO_SURROUND(&childUse->cu_def->cd_bbox, &scx->scx_area)
|| GEO_SURROUND(&scx->scx_area, &childUse->cu_def->cd_bbox));
if (surround || (expandSurround == DB_EXPAND_OVERLAP))
if (!GEO_SURROUND(&childUse->cu_def->cd_bbox, &scx->scx_area)
|| GEO_SURROUND(&scx->scx_area, &childUse->cu_def->cd_bbox))
{
childUse->cu_expandMask &= ~arg->ea_xmask;
expandTest = FALSE;
/* Call the client's function, if there is one. */
@ -248,7 +257,11 @@ dbExpandFunc(scx, arg)
}
}
if (DBCellSrArea(scx, dbExpandFunc, (ClientData) arg))
/* Don't recursively search things that aren't already expanded. */
else return 2;
if (DBCellSrArea(scx, dbUnexpandFunc, (ClientData) arg))
return 1;
return 2;
}
@ -262,8 +275,8 @@ dbExpandFunc(scx, arg)
* the given rectangle.
*
* Results:
* If "halt_on_error" is TRUE, then return a pointer to the first
* subcell that could not be read. Otherwise, return NULL.
* If "halt_on_error" is TRUE, then return 1 if any subcell could not
* be read. Otherwise, return 0.
*
* Side effects:
* May make new cells known to the database. Sets the CDAVAILABLE
@ -272,7 +285,7 @@ dbExpandFunc(scx, arg)
* ----------------------------------------------------------------------------
*/
CellDef *
int
DBCellReadArea(rootUse, rootRect, halt_on_error)
CellUse *rootUse; /* Root cell use from which search begins */
Rect *rootRect; /* Area to be read, in root coordinates */
@ -280,44 +293,33 @@ DBCellReadArea(rootUse, rootRect, halt_on_error)
{
int dbReadAreaFunc();
SearchContext scontext;
CellDef *err_def = NULL;
scontext.scx_use = rootUse;
scontext.scx_trans = GeoIdentityTransform;
scontext.scx_area = *rootRect;
if (dbReadAreaFunc(&scontext, ((halt_on_error == TRUE) ? &err_def : NULL)) == 1)
return err_def;
if (dbReadAreaFunc(&scontext, halt_on_error) == 1)
return 1;
return NULL;
return 0;
}
int
dbReadAreaFunc(scx, err_ptr)
dbReadAreaFunc(scx, halt_on_error)
SearchContext *scx; /* Pointer to context specifying
* the cell use to be read in, and
* an area to be recursively read in
* coordinates of the cell use's def.
*/
CellDef **err_ptr; /* If non-NULL, failure to find a cell causes a halt
* and the CellDef in error is returned in err_def.
* If NULL, failure to find a cell still causes a
* halt but no information is passed back to the
* calling routine.
*/
bool halt_on_error; /* If TRUE, failure to find a cell causes a halt */
{
CellDef *def = scx->scx_use->cu_def;
if ((def->cd_flags & CDAVAILABLE) == 0)
{
if (DBCellRead(def, TRUE, TRUE, NULL) == FALSE)
{
if (err_ptr != NULL) {
*err_ptr = def;
bool dereference = (def->cd_flags & CDDEREFERENCE) ? TRUE : FALSE;
if (DBCellRead(def, (char *)NULL, TRUE, dereference, NULL) == FALSE)
if (halt_on_error)
return 1;
}
else
return 0;
}
/* Note: we don't have to invoke DBReComputeBbox here because
* if the bbox changed then there was a timestamp mismatch and
@ -325,8 +327,9 @@ dbReadAreaFunc(scx, err_ptr)
*/
}
if (DBCellSrArea(scx, dbReadAreaFunc, (ClientData)err_ptr))
return 1;
if (DBCellSrArea(scx, dbReadAreaFunc, (ClientData)halt_on_error))
if (halt_on_error)
return 1;
/* Be clever about handling arrays: if the search area covers this
* whole definition, then there's no need to look at any other

File diff suppressed because it is too large Load Diff

View File

@ -24,7 +24,6 @@ static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <math.h> /* For sin(), cos(), and round() functions */
#include <ctype.h>
@ -37,13 +36,12 @@ static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/
#include "database/database.h"
#include "database/fonts.h"
#include "database/databaseInt.h"
#include "extract/extractInt.h" /* for ExtCurStyle */
#include "windows/windows.h"
#include "dbwind/dbwind.h"
#include "commands/commands.h"
#include "textio/textio.h"
static TileType DBPickLabelLayer(/* CellDef *def, Label *lab, bool doCalma */);
static TileType DBPickLabelLayer(/* CellDef *def, Label *lab, int noreconnect */);
/* Globally-accessible font information */
@ -280,7 +278,6 @@ DBEraseGlobLabel(cellDef, area, mask, areaReturn, globmatch)
bool erasedAny = FALSE;
TileType newType;
free_magic1_t mm1 = freeMagic1_init();
labPrev = NULL;
lab = cellDef->cd_labels;
while (lab != NULL)
@ -295,7 +292,7 @@ DBEraseGlobLabel(cellDef, area, mask, areaReturn, globmatch)
*/
if (!(lab->lab_type == TT_SPACE))
{
newType = DBPickLabelLayer(cellDef, lab, FALSE);
newType = DBPickLabelLayer(cellDef, lab, 0);
if (DBConnectsTo(newType, lab->lab_type)) goto nextLab;
}
}
@ -314,7 +311,7 @@ DBEraseGlobLabel(cellDef, area, mask, areaReturn, globmatch)
if ((lab->lab_font >= 0) && areaReturn)
GeoInclude(&lab->lab_bbox, areaReturn);
freeMagic1(&mm1, (char *) lab);
freeMagic((char *) lab);
lab = lab->lab_next;
erasedAny = TRUE;
continue;
@ -322,7 +319,6 @@ DBEraseGlobLabel(cellDef, area, mask, areaReturn, globmatch)
nextLab: labPrev = lab;
lab = lab->lab_next;
}
freeMagic1_end(&mm1);
if (erasedAny)
cellDef->cd_flags |= CDMODIFIED|CDGETNEWSTAMP;
@ -444,7 +440,6 @@ DBEraseLabelsByContent(def, rect, type, text)
{
Label *lab, *labPrev;
free_magic1_t mm1 = freeMagic1_init();
for (labPrev = NULL, lab = def->cd_labels;
lab != NULL;
labPrev = lab, lab = lab->lab_next)
@ -460,7 +455,7 @@ DBEraseLabelsByContent(def, rect, type, text)
else labPrev->lab_next = lab->lab_next;
if (def->cd_lastLabel == lab)
def->cd_lastLabel = labPrev;
freeMagic1(&mm1, (char *) lab);
freeMagic((char *) lab);
/* Don't iterate through loop, since this will skip a label:
* just go back to top. This is tricky!
@ -470,7 +465,6 @@ DBEraseLabelsByContent(def, rect, type, text)
if (lab == NULL) break;
else goto nextCheck;
}
freeMagic1_end(&mm1);
}
/*
@ -499,7 +493,6 @@ DBRemoveLabel(def, refLab)
{
Label *lab, *labPrev;
free_magic1_t mm1 = freeMagic1_init();
for (labPrev = NULL, lab = def->cd_labels;
lab != NULL;
labPrev = lab, lab = lab->lab_next)
@ -513,7 +506,7 @@ DBRemoveLabel(def, refLab)
else labPrev->lab_next = lab->lab_next;
if (def->cd_lastLabel == lab)
def->cd_lastLabel = labPrev;
freeMagic1(&mm1, (char *) lab);
freeMagic((char *) lab);
/* Don't iterate through loop, since this will skip a label:
* just go back to top. This is tricky!
@ -523,7 +516,6 @@ DBRemoveLabel(def, refLab)
if (lab == NULL) break;
else goto nextCheck;
}
freeMagic1_end(&mm1);
}
/*
@ -568,63 +560,6 @@ DBReOrientLabel(cellDef, area, newPos)
}
}
/*
* ----------------------------------------------------------------------------
*
* dbGetLabelArea ---
*
* Callback function used by DBAdjustLabels. Find all material under a label
* that is *not* the label type, and return the label area adjusted to leave
* out that amount.
*
* Note: This clips in a regular order, and does not consider what is the
* largest rectangular area outside the area that has been clipped out.
*
* ----------------------------------------------------------------------------
*/
int
dbGetLabelArea(tile, dinfo, area)
Tile *tile; /* Tile found. */
TileType dinfo; /* Split tile information (unused) */
Rect *area; /* Area to be modified. */
{
Rect r;
TiToRect(tile, &r);
if (r.r_xbot > area->r_xbot)
area->r_xtop = r.r_xbot;
else if (r.r_xtop < area->r_xtop)
area->r_xbot = r.r_xtop;
else if (r.r_ybot > area->r_ybot)
area->r_ytop = r.r_ybot;
else if (r.r_ytop < area->r_ytop)
area->r_ybot = r.r_ytop;
return 0;
}
/*
* ----------------------------------------------------------------------------
*
* dbLabelNotEmpty ---
*
* Callback function used by DBAdjustLabels. Finds any material under a
* label that is the label type, and returns 1 to stop the search.
*
* ----------------------------------------------------------------------------
*/
int
dbLabelNotEmpty(tile, dinfo, clientData)
Tile *tile; /* Tile found. */
TileType dinfo; /* Split tile information (unused) */
ClientData clientData; /* (unused) */
{
return 1;
}
/*
* ----------------------------------------------------------------------------
*
@ -654,7 +589,7 @@ DBAdjustLabels(def, area)
{
Label *lab;
TileType newType;
bool modified = FALSE, adjusted = FALSE;
bool modified = FALSE;
/* First, find each label that crosses the area we're
* interested in.
@ -663,72 +598,19 @@ DBAdjustLabels(def, area)
for (lab = def->cd_labels; lab != NULL; lab = lab->lab_next)
{
if (!GEO_TOUCH(&lab->lab_rect, area)) continue;
newType = DBPickLabelLayer(def, lab, FALSE);
newType = DBPickLabelLayer(def, lab, 0);
if (newType == lab->lab_type) continue;
if (lab->lab_flags & LABEL_STICKY) continue;
/* New behavior (5/2024) (idea from Philipp Guhring)---If the new
* type is space, then instead of immediately casting the label off
* of its material, find the amount of the label that is still
* covered by the material. If the material covers more than half
* the label area, then adjust the label area to match the material.
*/
adjusted = FALSE;
if (newType == TT_SPACE)
if ((DBVerbose >= DB_VERBOSE_ALL) && ((def->cd_flags & CDINTERNAL) == 0))
{
Rect r;
TileTypeBitMask lmask;
TTMaskSetOnlyType(&lmask, lab->lab_type);
/* To do: Add compatible types (contact, residue) */
/* If there is no material left inside the label area, then
* the label gets reassigned to space.
*/
if (DBSrPaintArea((Tile *) NULL, def->cd_planes[DBPlane(lab->lab_type)],
&lab->lab_rect, &lmask, dbLabelNotEmpty, (ClientData)NULL) == 1)
{
TTMaskCom(&lmask);
r = lab->lab_rect;
DBSrPaintArea((Tile *) NULL, def->cd_planes[DBPlane(lab->lab_type)],
&lab->lab_rect, &lmask, dbGetLabelArea, (ClientData) &r);
if (!GEO_RECTNULL(&r))
{
if ((DBVerbose >= DB_VERBOSE_ALL) &&
((def->cd_flags & CDINTERNAL) == 0))
{
TxPrintf("Adjusting size of label \"%s\" in cell %s.\n",
lab->lab_text, def->cd_name);
}
DBUndoEraseLabel(def, lab);
DBWLabelChanged(def, lab, DBW_ALLWINDOWS);
lab->lab_rect = r;
DBFontLabelSetBBox(lab);
DBUndoPutLabel(def, lab);
DBWLabelChanged(def, lab, DBW_ALLWINDOWS);
modified = TRUE;
adjusted = TRUE;
}
}
}
if (!adjusted)
{
if ((DBVerbose >= DB_VERBOSE_ALL) && ((def->cd_flags & CDINTERNAL) == 0))
{
TxPrintf("Moving label \"%s\" from %s to %s in cell %s.\n",
lab->lab_text, DBTypeLongName(lab->lab_type),
DBTypeLongName(newType), def->cd_name);
}
DBUndoEraseLabel(def, lab);
lab->lab_type = newType;
DBUndoPutLabel(def, lab);
modified = TRUE;
TxPrintf("Moving label \"%s\" from %s to %s in cell %s.\n",
lab->lab_text, DBTypeLongName(lab->lab_type),
DBTypeLongName(newType), def->cd_name);
}
DBUndoEraseLabel(def, lab);
lab->lab_type = newType;
DBUndoPutLabel(def, lab);
modified = TRUE;
}
if (modified) DBCellSetModified(def, TRUE);
@ -736,32 +618,17 @@ DBAdjustLabels(def, area)
/*
*---------------------------------------------------------------
*
* DBAdjustLabelsNew--
*
* Modified version of DBAdjustLabels, used with reading
* GDS and LEF files. Since those files use GDS layers and
* not magic layers, there is no exact relationship between
* the two. Instead, the cifinput rules are used to set an
* initial type only. The rules for label adjustment are
* different from DBAdjustLabels(), and so a different
* routine is called.
*
* Results:
* None.
*
* Side effects:
* The layer attachments of labels may change. For each
* such change, a message is output.
*
*---------------------------------------------------------------
* Extended version of DBAdjustLabels. If noreconnect == 0,
* this is supposed to be the same as DBAdjustlabels() above.
*/
void
DBAdjustLabelsNew(def, area)
DBAdjustLabelsNew(def, area, noreconnect)
CellDef *def; /* Cell whose paint was changed. */
Rect *area; /* Area where paint was modified. */
int noreconnect; /* if 1, don't move label to a type that doesn't
* connect to the original type, delete instead
*/
{
Label *lab, *labPrev;
TileType newType;
@ -775,42 +642,35 @@ DBAdjustLabelsNew(def, area)
lab = def->cd_labels;
while (lab != NULL)
{
bool doCalma = TRUE;
if (!GEO_TOUCH(&lab->lab_rect, area)) goto nextLab;
if (lab->lab_type == TT_SPACE) doCalma = FALSE;
newType = DBPickLabelLayer(def, lab, doCalma);
if (newType == lab->lab_type)
goto nextLab;
if (((newType < 0) || (newType == TT_SPACE)) && !(lab->lab_flags & LABEL_STICKY))
int locnoreconnect = noreconnect;
if (!GEO_TOUCH(&lab->lab_rect, area))
{
if (lab->lab_type == TT_SPACE)
{
TxPrintf("Deleting unattached label \"%s\" in cell %s.\n",
lab->lab_text, def->cd_name);
if (labPrev == NULL)
def->cd_labels = lab->lab_next;
else
labPrev->lab_next = lab->lab_next;
if (def->cd_lastLabel == lab)
def->cd_lastLabel = labPrev;
DBUndoEraseLabel(def, lab);
DBWLabelChanged(def, lab, DBW_ALLWINDOWS);
free_magic1_t mm1 = freeMagic1_init();
freeMagic1(&mm1, (char *) lab);
lab = lab->lab_next;
freeMagic1_end(&mm1);
modified = TRUE;
continue;
}
else
{
TxPrintf("Making label \"%s\" on type %s in cell %s sticky.\n",
goto nextLab;
}
if (lab->lab_type == TT_SPACE) locnoreconnect = FALSE;
newType = DBPickLabelLayer(def, lab, locnoreconnect);
if (newType == lab->lab_type)
{
goto nextLab;
}
if (newType < 0 && !(lab->lab_flags & LABEL_STICKY))
{
TxPrintf("Deleting ambiguous-layer label \"%s\" from %s in cell %s.\n",
lab->lab_text, DBTypeLongName(lab->lab_type),
def->cd_name);
lab->lab_flags |= LABEL_STICKY;
}
if (labPrev == NULL)
def->cd_labels = lab->lab_next;
else
labPrev->lab_next = lab->lab_next;
if (def->cd_lastLabel == lab)
def->cd_lastLabel = labPrev;
DBUndoEraseLabel(def, lab);
DBWLabelChanged(def, lab, DBW_ALLWINDOWS);
freeMagic((char *) lab);
lab = lab->lab_next;
modified = TRUE;
continue;
}
else if (!(lab->lab_flags & LABEL_STICKY))
{
@ -863,10 +723,10 @@ TileTypeBitMask *dbAdjustPlaneTypes; /* Mask of all types in current
* plane being searched.
*/
TileType
DBPickLabelLayer(def, lab, doCalma)
DBPickLabelLayer(def, lab, noreconnect)
CellDef *def; /* Cell definition containing label. */
Label *lab; /* Label for which a home must be found. */
bool doCalma; /* if TRUE, use rules for GDS and LEF */
int noreconnect; /* if 1, return -1 if rule 5 or 6 would succeed */
{
TileTypeBitMask types[3], types2[3];
Rect check1, check2;
@ -967,147 +827,112 @@ DBPickLabelLayer(def, lab, doCalma)
}
/* If the label's layer covers the label's area, use it.
* Otherwise, look for a layer in the following order
* (Note: "covers" means covers the area of the label if the
* label has area or touches the entire label if it doesn't.):
*
* If "doCalma" is TRUE, then:
* 1. A layer on the same plane as the original layer and that
* covers the label and is not a device type.
* 2. A layer on the same plane as the original layer and that
* covers the label.
* 3. A layer on the same plane as the original layer and that
* is a component of material that covers the label.
* 4. -1
*
* If "doCalma" is FALSE, then:
* 1. A layer on the same plane as the original layer and that
* covers the label and connects to its original layer.
* 2. A layer on the same plane as the original layer and that
* is a component of material that covers the label and
* connects to its original layer.
* 3. A layer that covers the label and connects to the old layer.
* 4. A layer that is a component of material that covers the
* label and connects to the old layer.
* 5. A layer that covers the label and is on the same plane as the
* label.
* 6. A layer that is a component of material that covers the label
* and is on the same plane as the label.
* 7. Space.
* Otherwise, look for a layer in the following order:
* 1. A layer on the same plane as the original layer and that
* covers the label and connects to its original layer.
* 2. A layer on the same plane as the original layer and that
* is a component of material that covers the label and
* connects to its original layer.
* 3. A layer that covers the label and connects to the
* old layer.
* 4. A layer that is a component of material that covers
* the label and connects to the old layer.
* 5. A layer that covers the label.
* 6. A layer that is a component of material that covers the label.
* 7. Space.
*
* All searches are done from the lowest to highest plane, so that
* the label connects to material on the highest plane that matches
* the criteria above. This avoids weirdnesses caused by declaring
* types out of order in the techfile.
*
* Note that when the "label" command is used with no type given,
* then lab_type is TT_SPACE and "same plane as the label" is all
* planes. This should never be true when called during GDS or
* LEF reads, so only needs to be checked when "doCalma" is FALSE.
*/
if (TTMaskHasType(&types[0], lab->lab_type)) return lab->lab_type;
plane = DBPlane(lab->lab_type);
choice1 = choice2 = choice3 = choice4 = choice5 = choice6 = TT_SPACE;
if (doCalma)
for (j = PL_SELECTBASE; j < DBNumPlanes; j++)
{
choice1 = choice2 = choice3 = -1;
for (i = TT_SELECTBASE; i < DBNumUserLayers; i += 1)
{
if (!TTMaskHasType(&DBPlaneTypes[plane], i)) continue;
if (!TTMaskHasType(&DBPlaneTypes[j], i)) continue;
if (TTMaskHasType(&types[0], i) && (ExtCurStyle != NULL))
if (DBConnectsTo(i, lab->lab_type))
{
if (TTMaskHasType(&ExtCurStyle->exts_deviceMask, i))
choice2 = i;
if (DBPlane(i) == plane)
{
if (TTMaskHasType(&types[0], i))
{
choice1 = i;
continue;
}
else if (TTMaskHasType(&types[1], i))
{
choice2 = i;
continue;
}
}
if (TTMaskHasType(&types[0], i))
{
choice3 = i;
continue;
}
else if (TTMaskHasType(&types[1], i))
{
choice4 = i;
continue;
}
}
if (TTMaskHasType(&types[0], i))
{
/* A type that connects to more than itself is preferred */
if (choice5 == TT_SPACE)
choice5 = i;
else
choice1 = i;
{
TileTypeBitMask ctest;
TTMaskZero(&ctest);
TTMaskSetMask(&ctest, &DBConnectTbl[i]);
TTMaskClearType(&ctest, i);
if (!TTMaskIsZero(&ctest))
choice5 = i;
else if (TTMaskHasType(&types[1], i))
choice6 = i;
}
continue;
}
else if (TTMaskHasType(&types[1], i))
{
choice3 = i;
choice6 = i;
continue;
}
}
if (choice1 != -1) return choice1;
else if (choice2 != -1) return choice2;
else return choice3;
}
else
{
choice1 = choice2 = choice3 = choice4 = choice5 = choice6 = TT_SPACE;
for (j = PL_SELECTBASE; j < DBNumPlanes; j++)
{
for (i = TT_SELECTBASE; i < DBNumUserLayers; i += 1)
{
if (!TTMaskHasType(&DBPlaneTypes[j], i)) continue;
if (DBConnectsTo(i, lab->lab_type))
{
if (DBPlane(i) == plane)
{
if (TTMaskHasType(&types[0], i))
{
choice1 = i;
continue;
}
else if (TTMaskHasType(&types[1], i))
{
choice2 = i;
continue;
}
}
if (TTMaskHasType(&types[0], i))
{
choice3 = i;
continue;
}
else if (TTMaskHasType(&types[1], i))
{
choice4 = i;
continue;
}
}
if ((DBPlane(i) == plane) || (lab->lab_type == TT_SPACE))
{
if (TTMaskHasType(&types[0], i))
{
/* A type that connects to more than itself is preferred */
if (choice5 == TT_SPACE)
choice5 = i;
else
{
TileTypeBitMask ctest;
TTMaskZero(&ctest);
TTMaskSetMask(&ctest, &DBConnectTbl[i]);
TTMaskClearType(&ctest, i);
if (!TTMaskIsZero(&ctest))
choice5 = i;
else if (TTMaskHasType(&types[1], i))
choice6 = i;
}
continue;
}
else if (TTMaskHasType(&types[1], i))
{
choice6 = i;
continue;
}
}
}
}
if (choice1 != TT_SPACE) return choice1;
else if (choice2 != TT_SPACE) return choice2;
else if (choice3 != TT_SPACE) return choice3;
else if (choice4 != TT_SPACE) return choice4;
else if (choice5 != TT_SPACE) return choice5;
else return choice6;
if (choice1 != TT_SPACE) return choice1;
else if (choice2 != TT_SPACE) return choice2;
else if (choice3 != TT_SPACE) return choice3;
else if (choice4 != TT_SPACE) return choice4;
else if (noreconnect) {
#ifdef notdef
TxPrintf("DBPickLabelLayer \"%s\" (on %s at %d,%d) choice4=%s choice5=%s choice6=%s.\n",
lab->lab_text,
DBTypeLongName(lab->lab_type),
lab->lab_rect.r_xbot,
lab->lab_rect.r_ytop,
DBTypeLongName(choice4),
DBTypeLongName(choice5),
DBTypeLongName(choice6));
#endif
/* If the flag is set, don't cause a netlist change by moving a
the label. So unless there's only space here, delete the label */
if(choice5 == TT_SPACE && choice6 == TT_SPACE)
return TT_SPACE;
else
return -1;
}
else if (choice5 != TT_SPACE) return choice5;
else return choice6;
}
/* Search function for DBPickLabelLayer: just OR in the type of
@ -1116,15 +941,14 @@ DBPickLabelLayer(def, lab, doCalma)
*/
int
dbPickFunc1(tile, dinfo, mask)
dbPickFunc1(tile, mask)
Tile *tile; /* Tile found. */
TileType dinfo; /* Split tile information */
TileTypeBitMask *mask; /* Mask to be modified. */
{
TileType type;
if (IsSplit(tile))
type = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
type = (SplitSide(tile)) ? SplitRightType(tile) : SplitLeftType(tile);
else
type = TiGetType(tile);
@ -1143,16 +967,15 @@ dbPickFunc1(tile, dinfo, mask)
*/
int
dbPickFunc2(tile, dinfo, mask)
dbPickFunc2(tile, mask)
Tile *tile; /* Tile found. */
TileType dinfo; /* Split tile information */
TileTypeBitMask *mask; /* Mask to be modified. */
{
TileType type;
TileTypeBitMask tmp, *rMask;
if (IsSplit(tile))
type = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
type = (SplitSide(tile)) ? SplitRightType(tile) : SplitLeftType(tile);
else
type = TiGetType(tile);
@ -1590,7 +1413,7 @@ DBLoadFont(fontfile, scale)
float scale;
{
FILE *ff;
const char * const ascii_names[] = {
char *ascii_names[] = {
"space", "exclam", "quotedbl", "numbersign", "dollar",
"percent", "ampersand", "quoteright", "parenleft", "parenright",
"asterisk", "plus", "comma", "hyphen", "period", "slash", "zero",
@ -1695,7 +1518,7 @@ DBLoadFont(fontfile, scale)
{
if (psname != NULL)
{
asciiidx = LookupStructFull(psname, ascii_names, sizeof(const char *));
asciiidx = LookupStructFull(psname, ascii_names, sizeof(char *));
if (asciiidx >= 0)
chardef = 2;
}
@ -1785,10 +1608,8 @@ DBLoadFont(fontfile, scale)
}
/* Remove the pointlist */
free_magic1_t mm1 = freeMagic1_init();
for (newPath = pathStart; newPath != NULL; newPath = newPath->fp_next)
freeMagic1(&mm1, newPath);
freeMagic1_end(&mm1);
freeMagic(newPath);
pathStart = NULL;
}
else

View File

@ -225,7 +225,7 @@ DBSrLabelLoc(rootUse, name, func, cdarg)
char csave;
Rect r;
if ((cp = strrchr(name, '/')))
if (cp = strrchr(name, '/'))
{
csave = *cp;
*cp = '\0';
@ -294,7 +294,10 @@ DBTreeFindUse(name, use, scx)
* is read in from disk.
*/
if ((def->cd_flags & CDAVAILABLE) == 0)
(void) DBCellRead(def, TRUE, TRUE, NULL);
{
bool dereference = (def->cd_flags & CDDEREFERENCE) ? TRUE : FALSE;
(void) DBCellRead(def, (char *) NULL, TRUE, dereference, NULL);
}
cp = name;
he = HashLookOnly(&def->cd_idHash, name);
@ -343,7 +346,10 @@ DBTreeFindUse(name, use, scx)
/* Ensure that the leaf cell is read in */
def = use->cu_def;
if ((def->cd_flags & CDAVAILABLE) == 0)
DBCellRead(def, TRUE, TRUE, NULL);
{
bool dereference = (def->cd_flags & CDDEREFERENCE) ? TRUE : FALSE;
(void) DBCellRead(def, (char *) NULL, TRUE, dereference, NULL);
}
scx->scx_use = use;
}

View File

@ -59,8 +59,6 @@ Tile *TiNMMergeRight();
Tile *TiNMMergeLeft();
#ifdef PAINTDEBUG
void dbPaintShowTile(Tile *tile, PaintUndoInfo *undo, char *str);
int dbPaintDebug = 0;
#endif /* PAINTDEBUG */
@ -242,7 +240,7 @@ int
DBPaintPlane0(plane, area, resultTbl, undo, method)
Plane *plane; /* Plane whose paint is to be modified */
Rect *area; /* Area to be changed */
const PaintResultType *resultTbl; /* Table, indexed by the type of tile already
PaintResultType *resultTbl; /* Table, indexed by the type of tile already
* present in the plane, giving the type to
* which the existing tile must change as a
* result of this paint operation.
@ -273,10 +271,9 @@ DBPaintPlane0(plane, area, resultTbl, undo, method)
* search.
*/
Tile *delayed = NULL; /* delayed free to extend lifetime */
start.p_x = area->r_xbot;
start.p_y = area->r_ytop - 1;
tile = PlaneGetHint(plane);
tile = plane->pl_hint;
GOTOPOINT(tile, &start);
/* Each iteration visits another tile on the LHS of the search area */
@ -313,11 +310,6 @@ enumerate:
* Set up the directions in which we will have to
* merge initially. Clipping can cause some of these
* to be turned off.
*
* The search runs from left to right, top to bottom.
* Therefore always merge left and up, but never right
* and down, unless at or beyond the each of the search
* area.
*/
mergeFlags = MRG_TOP | MRG_LEFT;
if (RIGHT(tile) >= area->r_xtop) mergeFlags |= MRG_RIGHT;
@ -347,7 +339,6 @@ enumerate:
* Merging is only necessary if we clip to the left or to
* the right, and then only to the top or the bottom.
* We do the merge in-line for efficiency.
* Clipping of split tiles is more complicated.
*/
/* Clip up */
@ -362,17 +353,13 @@ enumerate:
newType = (method == (unsigned char)PAINT_XOR) ?
*resultTbl : resultTbl[oldType];
if (mergeFlags & MRG_LEFT)
tile = TiNMMergeLeft(tile, plane);
if ((mergeFlags & MRG_RIGHT) || SplitDirection(newtile) == 1)
TiNMMergeRight(TR(newtile), plane);
tile = TiNMMergeLeft(tile, plane);
TiNMMergeRight(TR(newtile), plane);
}
else
{
if (mergeFlags & MRG_LEFT)
TiNMMergeLeft(newtile, plane);
if ((mergeFlags & MRG_RIGHT) || SplitDirection(tile) == 1)
TiNMMergeRight(TR(tile), plane);
TiNMMergeLeft(newtile, plane);
TiNMMergeRight(TR(tile), plane);
}
}
else
@ -401,17 +388,13 @@ enumerate:
newType = (method == (unsigned char)PAINT_XOR) ?
*resultTbl : resultTbl[oldType];
if (mergeFlags & MRG_LEFT)
tile = TiNMMergeLeft(tile, plane);
if ((mergeFlags & MRG_RIGHT) || SplitDirection(newtile) == 0)
TiNMMergeRight(TR(newtile), plane);
tile = TiNMMergeLeft(tile, plane);
TiNMMergeRight(TR(newtile), plane);
}
else
{
if (mergeFlags & MRG_LEFT)
TiNMMergeLeft(newtile, plane);
if ((mergeFlags & MRG_RIGHT) || SplitDirection(tile) == 0)
TiNMMergeRight(TR(tile), plane);
TiNMMergeLeft(newtile, plane);
TiNMMergeRight(TR(tile), plane);
}
}
else
@ -440,17 +423,13 @@ enumerate:
newType = (method == (unsigned char)PAINT_XOR) ?
*resultTbl : resultTbl[oldType];
if (mergeFlags & MRG_LEFT)
tile = TiNMMergeLeft(tile, plane);
if (mergeFlags & MRG_RIGHT)
TiNMMergeRight(LB(newtile), plane);
tile = TiNMMergeLeft(tile, plane);
TiNMMergeRight(LB(newtile), plane);
}
else
{
if (mergeFlags & MRG_LEFT)
TiNMMergeRight(newtile, plane);
if (mergeFlags & MRG_RIGHT)
TiNMMergeLeft(LB(tile), plane);
TiNMMergeRight(newtile, plane);
TiNMMergeLeft(LB(tile), plane);
}
}
else
@ -460,11 +439,11 @@ enumerate:
/* Merge the outside tile to its top */
tp = RT(newtile);
if (CANMERGE_Y(newtile, tp)) TiJoinY1(&delayed, newtile, tp, plane);
if (CANMERGE_Y(newtile, tp)) TiJoinY(newtile, tp, plane);
/* Merge the outside tile to its bottom */
tp = LB(newtile);
if (CANMERGE_Y(newtile, tp)) TiJoinY1(&delayed, newtile, tp, plane);
if (CANMERGE_Y(newtile, tp)) TiJoinY(newtile, tp, plane);
}
mergeFlags &= ~MRG_RIGHT;
}
@ -487,13 +466,13 @@ enumerate:
newType = (method == (unsigned char)PAINT_XOR) ?
*resultTbl : resultTbl[oldType];
if (mergeFlags & MRG_LEFT)
TiNMMergeLeft(LB(newtile), plane);
// tile = TiNMMergeRight(tile, plane);
TiNMMergeLeft(LB(newtile), plane);
}
else
{
if (mergeFlags & MRG_LEFT)
TiNMMergeLeft(newtile, plane);
TiNMMergeLeft(newtile, plane);
// TiNMMergeRight(LB(tile), plane);
}
}
else
@ -504,11 +483,11 @@ enumerate:
/* Merge the outside tile to its top */
tp = RT(newtile);
if (CANMERGE_Y(newtile, tp)) TiJoinY1(&delayed, newtile, tp, plane);
if (CANMERGE_Y(newtile, tp)) TiJoinY(newtile, tp, plane);
/* Merge the outside tile to its bottom */
tp = LB(newtile);
if (CANMERGE_Y(newtile, tp)) TiJoinY1(&delayed, newtile, tp, plane);
if (CANMERGE_Y(newtile, tp)) TiJoinY(newtile, tp, plane);
}
mergeFlags &= ~MRG_LEFT;
}
@ -600,7 +579,7 @@ clipdone:
if (mergeFlags & MRG_TOP)
{
tp = RT(tile);
if (CANMERGE_Y(tile, tp)) TiJoinY1(&delayed, tile, tp, plane);
if (CANMERGE_Y(tile, tp)) TiJoinY(tile, tp, plane);
#ifdef PAINTDEBUG
if (dbPaintDebug)
dbPaintShowTile(tile, undo, "merged up (CHEAP)");
@ -609,7 +588,7 @@ clipdone:
if (mergeFlags & MRG_BOTTOM)
{
tp = LB(tile);
if (CANMERGE_Y(tile, tp)) TiJoinY1(&delayed, tile, tp, plane);
if (CANMERGE_Y(tile, tp)) TiJoinY(tile, tp, plane);
#ifdef PAINTDEBUG
if (dbPaintDebug)
dbPaintShowTile(tile, undo, "merged down (CHEAP)");
@ -669,7 +648,7 @@ done:
start.p_x = area->r_xbot;
start.p_y = area->r_ytop - 1;
tile = PlaneGetHint(plane);
tile = plane->pl_hint;
GOTOPOINT(tile, &start);
while (TOP(tile) > area->r_ybot)
@ -717,8 +696,7 @@ enum2:
}
done2:
PlaneSetHint(plane, tile);
TiFreeIf(delayed);
plane->pl_hint = tile;
return 0;
}
@ -741,7 +719,7 @@ DBSplitTile(plane, point, splitx)
int splitx;
{
Tile *tile, *newtile, *tp;
tile = PlaneGetHint(plane);
tile = plane->pl_hint;
GOTOPOINT(tile, point);
if (IsSplit(tile)) /* This should always be true */
@ -788,7 +766,7 @@ void
DBFracturePlane(plane, area, resultTbl, undo)
Plane *plane; /* Plane whose paint is to be modified */
Rect *area; /* Area to be changed */
const PaintResultType *resultTbl; /* Paint table, to pinpoint those tiles
PaintResultType *resultTbl; /* Paint table, to pinpoint those tiles
* that interact with the paint type.
*/
PaintUndoInfo *undo; /* Record containing everything needed to
@ -815,7 +793,7 @@ DBFracturePlane(plane, area, resultTbl, undo)
start.p_x = area->r_xbot;
start.p_y = area->r_ytop - 1;
tile = PlaneGetHint(plane);
tile = plane->pl_hint;
GOTOPOINT(tile, &start);
/* Each iteration visits another tile on the LHS of the search area */
@ -1012,7 +990,7 @@ paintdone:
}
done:
PlaneSetHint(plane, tile);
plane->pl_hint = tile;
}
/*
@ -1054,12 +1032,11 @@ DBMergeNMTiles0(plane, area, undo, mergeOnce)
int clipTop;
Tile *tile, *tp, *tp2, *newtile, *tpnew;
int aspecta, aspectb;
Tile *delayed = NULL; /* delayed free to extend lifetime */
TileType ttype, ltype, rtype;
start.p_x = area->r_xbot;
start.p_y = area->r_ytop - 1;
tile = PlaneGetHint(plane);
tile = plane->pl_hint;
GOTOPOINT(tile, &start);
/* Each iteration visits another tile on the LHS of the search area */
@ -1144,23 +1121,23 @@ nmenum:
newtile = TiSplitY(tp2, TOP(tile));
TiSetBody(newtile, ltype);
if (CANMERGE_X(newtile, BL(newtile)))
TiJoinX1(&delayed, newtile, BL(newtile), plane);
TiJoinX(newtile, BL(newtile), plane);
if (CANMERGE_X(newtile, TR(newtile)))
TiJoinX1(&delayed, newtile, TR(newtile), plane);
TiJoinX(newtile, TR(newtile), plane);
if (CANMERGE_Y(newtile, RT(newtile)))
TiJoinY1(&delayed, newtile, RT(newtile), plane);
TiJoinY(newtile, RT(newtile), plane);
}
if (LEFT(tp2) < LEFT(tp))
{
newtile = TiSplitX(tp2, LEFT(tp));
TiSetBody(newtile, ltype);
if (CANMERGE_Y(tp2, LB(tp2)))
TiJoinY1(&delayed, tp2, LB(tp2), plane);
TiJoinY(tp2, LB(tp2), plane);
if (CANMERGE_Y(tp2, RT(tp2)))
TiJoinY1(&delayed, tp2, RT(tp2), plane);
TiJoinY(tp2, RT(tp2), plane);
tp2 = newtile;
}
TiJoinY1(&delayed, tp2, tp, plane);
TiJoinY(tp2, tp, plane);
tp = tp2;
tp2 = RT(tp2);
}
@ -1174,11 +1151,11 @@ nmenum:
newtile = TiSplitY(tp2, BOTTOM(tp));
TiSetBody(newtile, rtype);
if (CANMERGE_X(tp2, BL(tp2)))
TiJoinX1(&delayed, tp2, BL(tp2), plane);
TiJoinX(tp2, BL(tp2), plane);
if (CANMERGE_X(tp2, TR(tp2)))
TiJoinX1(&delayed, tp2, TR(tp2), plane);
TiJoinX(tp2, TR(tp2), plane);
if (CANMERGE_Y(tp2, LB(tp2)))
TiJoinY1(&delayed, tp2, LB(tp2), plane);
TiJoinY(tp2, LB(tp2), plane);
tp2 = newtile;
}
if (RIGHT(tp2) > RIGHT(tile))
@ -1186,16 +1163,16 @@ nmenum:
newtile = TiSplitX(tp2, RIGHT(tile));
TiSetBody(newtile, rtype);
if (CANMERGE_Y(newtile, LB(newtile)))
TiJoinY1(&delayed, newtile, LB(newtile), plane);
TiJoinY(newtile, LB(newtile), plane);
if (CANMERGE_Y(newtile, RT(newtile)))
TiJoinY1(&delayed, newtile, RT(newtile), plane);
TiJoinY(newtile, RT(newtile), plane);
}
TiJoinY1(&delayed, tp2, tile, plane);
TiJoinY(tp2, tile, plane);
tile = tp2;
tp2 = LB(tp2);
}
/* Merge tp and tile */
TiJoinX1(&delayed, tile, tp, plane);
TiJoinX(tile, tp, plane);
TiSetBody(tile, ttype);
}
else /* split direction 1 */
@ -1236,11 +1213,11 @@ nmenum:
newtile = TiSplitY(tp2, BOTTOM(tp));
TiSetBody(newtile, ltype);
if (CANMERGE_X(tp2, BL(tp2)))
TiJoinX1(&delayed, tp2, BL(tp2), plane);
TiJoinX(tp2, BL(tp2), plane);
if (CANMERGE_X(tp2, TR(tp2)))
TiJoinX1(&delayed, tp2, TR(tp2), plane);
TiJoinX(tp2, TR(tp2), plane);
if (CANMERGE_Y(tp2, LB(tp2)))
TiJoinY1(&delayed, tp2, LB(tp2), plane);
TiJoinY(tp2, LB(tp2), plane);
tp2 = newtile;
}
if (LEFT(tp2) < LEFT(tile))
@ -1248,12 +1225,12 @@ nmenum:
newtile = TiSplitX(tp2, LEFT(tile));
TiSetBody(newtile, ltype);
if (CANMERGE_Y(tp2, LB(tp2)))
TiJoinY1(&delayed, tp2, LB(tp2), plane);
TiJoinY(tp2, LB(tp2), plane);
if (CANMERGE_Y(tp2, RT(tp2)))
TiJoinY1(&delayed, tp2, RT(tp2), plane);
TiJoinY(tp2, RT(tp2), plane);
tp2 = newtile;
}
TiJoinY1(&delayed, tp2, tile, plane);
TiJoinY(tp2, tile, plane);
tile = tp2;
tp2 = LB(tp2);
}
@ -1268,27 +1245,27 @@ nmenum:
newtile = TiSplitY(tp2, TOP(tile));
TiSetBody(newtile, rtype);
if (CANMERGE_X(newtile, BL(newtile)))
TiJoinX1(&delayed, newtile, BL(newtile), plane);
TiJoinX(newtile, BL(newtile), plane);
if (CANMERGE_X(newtile, TR(newtile)))
TiJoinX1(&delayed, newtile, TR(newtile), plane);
TiJoinX(newtile, TR(newtile), plane);
if (CANMERGE_Y(newtile, RT(newtile)))
TiJoinY1(&delayed, newtile, RT(newtile), plane);
TiJoinY(newtile, RT(newtile), plane);
}
if (RIGHT(tp2) > RIGHT(tp))
{
newtile = TiSplitX(tp2, RIGHT(tp));
TiSetBody(newtile, rtype);
if (CANMERGE_Y(newtile, LB(newtile)))
TiJoinY1(&delayed, newtile, LB(newtile), plane);
TiJoinY(newtile, LB(newtile), plane);
if (CANMERGE_Y(newtile, RT(newtile)))
TiJoinY1(&delayed, newtile, RT(newtile), plane);
TiJoinY(newtile, RT(newtile), plane);
}
TiJoinY1(&delayed, tp2, tp, plane);
TiJoinY(tp2, tp, plane);
tp = tp2;
tp2 = RT(tp2);
}
/* Merge tp and tile */
TiJoinX1(&delayed, tile, tp, plane);
TiJoinX(tile, tp, plane);
TiSetBody(tile, ttype);
}
/* Now repeat until no more merging is possible */
@ -1329,8 +1306,7 @@ nmenum:
}
nmdone:
PlaneSetHint(plane, tile);
TiFreeIf(delayed);
plane->pl_hint = tile;
return 0;
}
@ -1364,7 +1340,7 @@ DBDiagonalProc(oldtype, dinfo)
TileType old_n, old_s, old_e, old_w;
TileType new_n, new_s, new_e, new_w;
TileType newtype;
const PaintResultType *resultTbl = dinfo->resultTbl;
PaintResultType *resultTbl = dinfo->resultTbl;
/* Disassemble old and new types into four quadrants, find the */
/* paint result for each quadrant, then reassemble the result. */
@ -1435,6 +1411,10 @@ DBDiagonalProc(oldtype, dinfo)
else
return -1;
/* For purposes of "undo" recording, record which side we just painted */
if (dinfo->side)
newtype |= TT_SIDE;
return newtype;
}
@ -1477,7 +1457,7 @@ DBNMPaintPlane0(plane, exacttype, area, resultTbl, undo, method)
Plane *plane; /* Plane whose paint is to be modified */
TileType exacttype; /* diagonal info for tile to be changed */
Rect *area; /* Area to be changed */
const PaintResultType *resultTbl; /* Table, indexed by the type of tile already
PaintResultType *resultTbl; /* Table, indexed by the type of tile already
* present in the plane, giving the type to
* which the existing tile must change as a
* result of this paint operation.
@ -1519,7 +1499,7 @@ DBNMPaintPlane0(plane, exacttype, area, resultTbl, undo, method)
/* linked list out of them. */
lhead = NULL;
DBSrPaintArea(PlaneGetHint(plane), plane, area, &DBAllTypeBits,
DBSrPaintArea(plane->pl_hint, plane, area, &DBAllTypeBits,
dbNMEnumFunc, (ClientData) &lhead);
/*--------------------------------------------------------------*/
@ -1539,7 +1519,7 @@ DBNMPaintPlane0(plane, exacttype, area, resultTbl, undo, method)
GeoClip(&lhead->r_r, area);
start.p_x = area->r_xbot;
start.p_y = area->r_ytop - 1;
tile = PlaneGetHint(plane);
tile = plane->pl_hint;
GOTOPOINT(tile, &start);
/* Ignore tiles that don't interact. This has */
@ -1628,7 +1608,7 @@ DBNMPaintPlane0(plane, exacttype, area, resultTbl, undo, method)
{
result = DBPaintPlane(plane, &(lr->r_r), DBSpecialPaintTbl,
(PaintUndoInfo *)NULL);
tile = PlaneGetHint(plane);
tile = plane->pl_hint;
GOTOPOINT(tile, &(lr->r_r.r_ll));
if (undo && UndoIsEnabled())
{
@ -1788,14 +1768,12 @@ nextrect:
lr = lr->r_next;
}
free_magic1_t mm1 = freeMagic1_init();
lr = lhead;
while (lr != NULL)
{
freeMagic1(&mm1, (char *) lr);
freeMagic((char *) lr);
lr = lr->r_next;
}
freeMagic1_end(&mm1);
}
else
result = DBPaintPlane0(plane, area, resultTbl, undo, (method == PAINT_MARK) ?
@ -1816,15 +1794,14 @@ nextrect:
*/
int
dbNMEnumFunc(tile, dinfo, arg)
dbNMEnumFunc(tile, arg)
Tile *tile;
TileType dinfo;
LinkedRect **arg;
{
LinkedRect *lr;
/* Ignore the second call to any diagonal---only count once! */
if (IsSplit(tile) && (dinfo & TT_SIDE)) return 0;
if (IsSplit(tile) && SplitSide(tile)) return 0;
lr = (LinkedRect *) mallocMagic(sizeof(LinkedRect));
TiToRect(tile, &lr->r_r);
@ -1908,7 +1885,6 @@ dbPaintMerge(tile, newType, area, plane, mergeFlags, undo, mark)
PaintUndoInfo *undo; /* See DBPaintPlane() above */
bool mark; /* Mark tiles that were processed */
{
Tile *delayed = NULL; /* delayed free to extend lifetime */
Tile *tp, *tpLast;
int ysplit;
@ -2015,7 +1991,7 @@ dbPaintMerge(tile, newType, area, plane, mergeFlags, undo, mark)
if (mark) dbMarkClient(tile, area);
}
if (BOTTOM(tp) < BOTTOM(tile)) tp = TiSplitY(tp, BOTTOM(tile));
TiJoinX1(&delayed, tile, tp, plane);
TiJoinX(tile, tp, plane);
#ifdef PAINTDEBUG
if (dbPaintDebug)
dbPaintShowTile(tile, undo, "(DBMERGE) merged left");
@ -2031,7 +2007,7 @@ dbPaintMerge(tile, newType, area, plane, mergeFlags, undo, mark)
if (mark) dbMarkClient(tile, area);
}
if (BOTTOM(tp) < BOTTOM(tile)) tp = TiSplitY(tp, BOTTOM(tile));
TiJoinX1(&delayed, tile, tp, plane);
TiJoinX(tile, tp, plane);
#ifdef PAINTDEBUG
if (dbPaintDebug)
dbPaintShowTile(tile, undo, "(DBMERGE) merged right");
@ -2040,7 +2016,7 @@ dbPaintMerge(tile, newType, area, plane, mergeFlags, undo, mark)
if (mergeFlags&MRG_TOP)
{
tp = RT(tile);
if (CANMERGE_Y(tp, tile)) TiJoinY1(&delayed, tile, tp, plane);
if (CANMERGE_Y(tp, tile)) TiJoinY(tile, tp, plane);
#ifdef PAINTDEBUG
if (dbPaintDebug)
dbPaintShowTile(tile, undo, "(DBMERGE) merged up");
@ -2049,14 +2025,13 @@ dbPaintMerge(tile, newType, area, plane, mergeFlags, undo, mark)
if (mergeFlags&MRG_BOTTOM)
{
tp = LB(tile);
if (CANMERGE_Y(tp, tile)) TiJoinY1(&delayed, tile, tp, plane);
if (CANMERGE_Y(tp, tile)) TiJoinY(tile, tp, plane);
#ifdef PAINTDEBUG
if (dbPaintDebug)
dbPaintShowTile(tile, undo, "(DBMERGE) merged down");
#endif /* PAINTDEBUG */
}
TiFreeIf(delayed);
return (tile);
}
@ -2089,7 +2064,7 @@ void
DBPaintType(plane, area, resultTbl, client, undo, tileMask)
Plane *plane; /* Plane whose paint is to be modified */
Rect *area; /* Area to be changed */
const PaintResultType *resultTbl; /* Table, indexed by the type of tile already
PaintResultType *resultTbl; /* Table, indexed by the type of tile already
* present in the plane, giving the type to
* which the existing tile must change as a
* result of this paint operation.
@ -2119,10 +2094,9 @@ DBPaintType(plane, area, resultTbl, client, undo, tileMask)
* search.
*/
Tile *delayed = NULL; /* delayed free to extend lifetime */
start.p_x = area->r_xbot;
start.p_y = area->r_ytop - 1;
tile = PlaneGetHint(plane);
tile = plane->pl_hint;
GOTOPOINT(tile, &start);
/* Each iteration visits another tile on the LHS of the search area */
@ -2212,14 +2186,14 @@ enumerate:
if (CANMERGE_Y(newtile, tp) &&
( (TiGetClient(tp) == TiGetClient(newtile)) ||
( ! TTMaskHasType(tileMask, TiGetTypeExact(tp)) ) ) )
TiJoinY1(&delayed, newtile, tp, plane);
TiJoinY(newtile, tp, plane);
/* Merge the outside tile to its bottom */
tp = LB(newtile);
if (CANMERGE_Y(newtile, tp) &&
( (TiGetClient(tp) == TiGetClient(newtile)) ||
( ! TTMaskHasType(tileMask, TiGetTypeExact(tp)) ) ) )
TiJoinY1(&delayed, newtile, tp, plane);
TiJoinY(newtile, tp, plane);
}
/* Clip left */
@ -2236,14 +2210,14 @@ enumerate:
if (CANMERGE_Y(newtile, tp) &&
( (TiGetClient(tp) == TiGetClient(newtile)) ||
( ! TTMaskHasType(tileMask, TiGetTypeExact(tp)) ) ) )
TiJoinY1(&delayed, newtile, tp, plane);
TiJoinY(newtile, tp, plane);
/* Merge the outside tile to its bottom */
tp = LB(newtile);
if (CANMERGE_Y(newtile, tp) &&
( (TiGetClient(tp) == TiGetClient(newtile)) ||
( ! TTMaskHasType(tileMask, TiGetTypeExact(tp)) ) ) )
TiJoinY1(&delayed, newtile, tp, plane);
TiJoinY(newtile, tp, plane);
}
#ifdef PAINTDEBUG
@ -2302,7 +2276,7 @@ enumerate:
{
tp = RT(tile);
if (CANMERGE_Y(tile, tp) && (tp->ti_client == client))
TiJoinY1(&delayed, tile, tp, plane);
TiJoinY(tile, tp, plane);
#ifdef PAINTDEBUG
if (dbPaintDebug)
dbPaintShowTile(tile, undo, "merged up (CHEAP)");
@ -2312,7 +2286,7 @@ enumerate:
{
tp = LB(tile);
if (CANMERGE_Y(tile, tp) && (tp->ti_client == client))
TiJoinY1(&delayed, tile, tp, plane);
TiJoinY(tile, tp, plane);
#ifdef PAINTDEBUG
if (dbPaintDebug)
dbPaintShowTile(tile, undo, "merged down (CHEAP)");
@ -2359,8 +2333,7 @@ paintdone:
}
done:
PlaneSetHint(plane, tile);
TiFreeIf(delayed);
plane->pl_hint = tile;
}
/*
@ -2407,7 +2380,6 @@ dbMergeType(tile, newType, plane, mergeFlags, undo, client)
PaintUndoInfo *undo; /* See DBPaintPlane() above */
ClientData client;
{
Tile *delayed = NULL; /* delayed free to extend lifetime */
Tile *tp, *tpLast;
int ysplit;
@ -2509,7 +2481,7 @@ dbMergeType(tile, newType, plane, mergeFlags, undo, client)
TiSetClient(tpLast, client);
}
if (BOTTOM(tp) < BOTTOM(tile)) tp = TiSplitY(tp, BOTTOM(tile));
TiJoinX1(&delayed, tile, tp, plane);
TiJoinX(tile, tp, plane);
#ifdef PAINTDEBUG
if (dbPaintDebug)
dbPaintShowTile(tile, undo, "(DBMERGE) merged left");
@ -2525,7 +2497,7 @@ dbMergeType(tile, newType, plane, mergeFlags, undo, client)
TiSetClient(tpLast, client);
}
if (BOTTOM(tp) < BOTTOM(tile)) tp = TiSplitY(tp, BOTTOM(tile));
TiJoinX1(&delayed, tile, tp, plane);
TiJoinX(tile, tp, plane);
#ifdef PAINTDEBUG
if (dbPaintDebug)
dbPaintShowTile(tile, undo, "(DBMERGE) merged right");
@ -2534,7 +2506,7 @@ dbMergeType(tile, newType, plane, mergeFlags, undo, client)
if (mergeFlags&MRG_TOP)
{
tp = RT(tile);
if (CANMERGE_Y(tp, tile) && (tp->ti_client == client)) TiJoinY1(&delayed, tile, tp, plane);
if (CANMERGE_Y(tp, tile) && (tp->ti_client == client)) TiJoinY(tile, tp, plane);
#ifdef PAINTDEBUG
if (dbPaintDebug)
dbPaintShowTile(tile, undo, "(DBMERGE) merged up");
@ -2543,14 +2515,13 @@ dbMergeType(tile, newType, plane, mergeFlags, undo, client)
if (mergeFlags&MRG_BOTTOM)
{
tp = LB(tile);
if (CANMERGE_Y(tp, tile) && (tp->ti_client == client)) TiJoinY1(&delayed, tile, tp, plane);
if (CANMERGE_Y(tp, tile) && (tp->ti_client == client)) TiJoinY(tile, tp, plane);
#ifdef PAINTDEBUG
if (dbPaintDebug)
dbPaintShowTile(tile, undo, "(DBMERGE) merged down");
#endif /* PAINTDEBUG */
}
TiFreeIf(delayed);
return (tile);
}
@ -2584,7 +2555,7 @@ int
DBPaintPlaneVert(plane, area, resultTbl, undo)
Plane *plane; /* Plane whose paint is to be modified */
Rect *area; /* Area to be changed */
const PaintResultType *resultTbl; /* Table, indexed by the type of tile already
PaintResultType *resultTbl; /* Table, indexed by the type of tile already
* present in the plane, giving the type to
* which the existing tile must change as a
* result of this paint operation.
@ -2610,10 +2581,9 @@ DBPaintPlaneVert(plane, area, resultTbl, undo)
* search.
*/
Tile *delayed = NULL; /* delayed free to extend lifetime */
start.p_x = area->r_xbot;
start.p_y = area->r_ytop - 1;
tile = PlaneGetHint(plane);
tile = plane->pl_hint;
GOTOPOINT(tile, &start);
/* Each iteration visits another tile on the LHS of the search area */
@ -2692,11 +2662,11 @@ enumerate:
/* Merge the outside tile to its left */
tp = BL(newtile);
if (CANMERGE_X(newtile, tp)) TiJoinX1(&delayed, newtile, tp, plane);
if (CANMERGE_X(newtile, tp)) TiJoinX(newtile, tp, plane);
/* Merge the outside tile to its right */
tp = TR(newtile);
if (CANMERGE_X(newtile, tp)) TiJoinX1(&delayed, newtile, tp, plane);
if (CANMERGE_X(newtile, tp)) TiJoinX(newtile, tp, plane);
}
/* Clip down */
@ -2708,11 +2678,11 @@ enumerate:
/* Merge the outside tile to its left */
tp = BL(newtile);
if (CANMERGE_X(newtile, tp)) TiJoinX1(&delayed, newtile, tp, plane);
if (CANMERGE_X(newtile, tp)) TiJoinX(newtile, tp, plane);
/* Merge the outside tile to its right */
tp = TR(newtile);
if (CANMERGE_X(newtile, tp)) TiJoinX1(&delayed, newtile, tp, plane);
if (CANMERGE_X(newtile, tp)) TiJoinX(newtile, tp, plane);
}
#ifdef PAINTDEBUG
@ -2770,7 +2740,7 @@ enumerate:
if (mergeFlags & MRG_LEFT)
{
tp = BL(tile);
if (CANMERGE_X(tile, tp)) TiJoinX1(&delayed, tile, tp, plane);
if (CANMERGE_X(tile, tp)) TiJoinX(tile, tp, plane);
#ifdef PAINTDEBUG
if (dbPaintDebug)
dbPaintShowTile(tile, undo, "merged left (CHEAP)");
@ -2779,7 +2749,7 @@ enumerate:
if (mergeFlags & MRG_RIGHT)
{
tp = TR(tile);
if (CANMERGE_X(tile, tp)) TiJoinX1(&delayed, tile, tp, plane);
if (CANMERGE_X(tile, tp)) TiJoinX(tile, tp, plane);
#ifdef PAINTDEBUG
if (dbPaintDebug)
dbPaintShowTile(tile, undo, "merged right (CHEAP)");
@ -2826,8 +2796,7 @@ paintdone:
}
done:
PlaneSetHint(plane, tile);
TiFreeIf(delayed);
plane->pl_hint = tile;
return 0;
}
@ -2880,7 +2849,6 @@ dbPaintMergeVert(tile, newType, plane, mergeFlags, undo)
int mergeFlags; /* Specify which directions to merge */
PaintUndoInfo *undo; /* See DBPaintPlane() above */
{
Tile *delayed = NULL; /* delayed free to extend lifetime */
Tile *tp, *tpLast;
int xsplit;
@ -2975,7 +2943,7 @@ dbPaintMergeVert(tile, newType, plane, mergeFlags, undo)
if (LEFT(tp) < LEFT(tile)) tp = TiSplitX(tp, LEFT(tile));
if (RIGHT(tp) > RIGHT(tile))
tpLast = TiSplitX(tp, RIGHT(tile)), TiSetBody(tpLast, newType);
TiJoinY1(&delayed, tile, tp, plane);
TiJoinY(tile, tp, plane);
#ifdef PAINTDEBUG
if (dbPaintDebug)
dbPaintShowTile(tile, undo, "(DBMERGE) merged up");
@ -2988,7 +2956,7 @@ dbPaintMergeVert(tile, newType, plane, mergeFlags, undo)
if (LEFT(tp) < LEFT(tile)) tp = TiSplitX(tp, LEFT(tile));
if (RIGHT(tp) > RIGHT(tile))
tpLast = TiSplitX(tp, RIGHT(tile)), TiSetBody(tpLast, newType);
TiJoinY1(&delayed, tile, tp, plane);
TiJoinY(tile, tp, plane);
#ifdef PAINTDEBUG
if (dbPaintDebug)
dbPaintShowTile(tile, undo, "(DBMERGE) merged down");
@ -2998,7 +2966,7 @@ dbPaintMergeVert(tile, newType, plane, mergeFlags, undo)
if (mergeFlags&MRG_LEFT)
{
tp = BL(tile);
if (CANMERGE_X(tp, tile)) TiJoinX1(&delayed, tile, tp, plane);
if (CANMERGE_X(tp, tile)) TiJoinX(tile, tp, plane);
#ifdef PAINTDEBUG
if (dbPaintDebug)
dbPaintShowTile(tile, undo, "(DBMERGE) merged left");
@ -3007,14 +2975,13 @@ dbPaintMergeVert(tile, newType, plane, mergeFlags, undo)
if (mergeFlags&MRG_RIGHT)
{
tp = TR(tile);
if (CANMERGE_X(tp, tile)) TiJoinX1(&delayed, tile, tp, plane);
if (CANMERGE_X(tp, tile)) TiJoinX(tile, tp, plane);
#ifdef PAINTDEBUG
if (dbPaintDebug)
dbPaintShowTile(tile, undo, "(DBMERGE) merged right");
#endif /* PAINTDEBUG */
}
TiFreeIf(delayed);
return (tile);
}
@ -3037,7 +3004,7 @@ dbPaintMergeVert(tile, newType, plane, mergeFlags, undo)
* ----------------------------------------------------------------------------
*/
#include "utils/styles.h"
#include "styles.h"
void
dbPaintShowTile(tile, undo, str)
@ -3060,16 +3027,6 @@ dbPaintShowTile(tile, undo, str)
TxPrintf("%s --more--", str); fflush(stdout);
(void) TxGetLine(answer, sizeof answer);
DBWFeedbackClear(NULL);
/* To debug tile operations that happen away from the active layout
* window, it may be advantageous to replace the display code above
* with the print statement below.
*/
/*
TxPrintf("Debug %s: Tile (%d %d) to (%d %d) type %d\n",
str, LEFT(tile), BOTTOM(tile), RIGHT(tile), TOP(tile),
TiGetBody(tile));
*/
}
#endif /* PAINTDEBUG */
@ -3359,7 +3316,6 @@ TiNMMergeRight(tile, plane)
Tile *tile;
Plane *plane;
{
Tile *delayed = NULL; /* delayed free to extend lifetime */
TileType ttype = TiGetTypeExact(tile);
Tile *tp, *tp2, *newtile;
@ -3391,7 +3347,7 @@ TiNMMergeRight(tile, plane)
else
newtile = tile;
// Join tp to newtile
TiJoinX1(&delayed, newtile, tp, plane);
TiJoinX(newtile, tp, plane);
}
tp = tp2;
}
@ -3408,13 +3364,11 @@ TiNMMergeRight(tile, plane)
newtile = TiSplitY(tp, BOTTOM(tile));
TiSetBody(newtile, ttype);
// join newtile to tile
TiJoinX1(&delayed, tile, newtile, plane);
TiJoinX(tile, newtile, plane);
// merge up if possible
if (CANMERGE_Y(tile, RT(tile))) TiJoinY1(&delayed, tile, RT(tile), plane);
if (CANMERGE_Y(tile, RT(tile))) TiJoinY(tile, RT(tile), plane);
}
}
TiFreeIf(delayed);
return tile;
}
@ -3442,7 +3396,6 @@ TiNMMergeLeft(tile, plane)
Tile *tile;
Plane *plane;
{
Tile *delayed = NULL; /* delayed free to extend lifetime */
TileType ttype = TiGetTypeExact(tile);
Tile *tp, *tp2, *newtile;
@ -3475,7 +3428,7 @@ TiNMMergeLeft(tile, plane)
else
newtile = tile;
// Join tp to tile
TiJoinX1(&delayed, tile, tp, plane);
TiJoinX(tile, tp, plane);
tile = newtile;
}
tp = tp2;
@ -3493,16 +3446,14 @@ TiNMMergeLeft(tile, plane)
newtile = TiSplitY(tp, TOP(tile));
TiSetBody(newtile, ttype);
// join tp to tile
TiJoinX1(&delayed, tile, tp, plane);
TiJoinX(tile, tp, plane);
}
}
else
{
// Merge up if possible
if (CANMERGE_Y(tile, tp)) TiJoinY1(&delayed, tile, tp, plane);
if (CANMERGE_Y(tile, tp)) TiJoinY(tile, tp, plane);
}
TiFreeIf(delayed);
return tile;
}

View File

@ -119,9 +119,8 @@ DBPaint (cellDef, rect, type)
*/
int
dbResolveImages(tile, dinfo, cellDef)
dbResolveImages(tile, cellDef)
Tile *tile;
TileType dinfo;
CellDef *cellDef;
{
Rect rect;
@ -131,7 +130,7 @@ dbResolveImages(tile, dinfo, cellDef)
/* Recursive call back to DBPaint---this will ensure that */
/* all of the planes of the image type are painted. */
DBPaint(cellDef, &rect, TiGetTypeExact(tile) | dinfo);
DBPaint(cellDef, &rect, TiGetTypeExact(tile));
return 0;
}
@ -284,7 +283,6 @@ DBPaintValid(cellDef, rect, mask, dinfo)
for (t = TT_SELECTBASE; t < DBNumUserLayers; t++)
if (TTMaskHasType(&mmask, t))
{
if (DBIsContact(t))
{
tMask = DBResidueMask(t);
@ -312,7 +310,6 @@ DBPaintValid(cellDef, rect, mask, dinfo)
(t << 14) : t) : t);
DBPaint(cellDef, rect, tloc);
}
}
}
/*
@ -385,7 +382,6 @@ DBEraseValid(cellDef, rect, mask, dinfo)
for (t = TT_SELECTBASE; t < DBNumUserLayers; t++)
if (TTMaskHasType(&mmask, t))
{
if (DBIsContact(t))
{
tMask = DBResidueMask(t);
@ -413,5 +409,4 @@ DBEraseValid(cellDef, rect, mask, dinfo)
(t << 14) : t) : t);
DBErase(cellDef, rect, tloc);
}
}
}

View File

@ -32,16 +32,6 @@ static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/
#include "database/database.h"
#include "utils/malloc.h"
/* Global variable */
bool DBPropCompat = TRUE; /* If TRUE, then always save properties to
* .mag files as type "string" for backwards
* compatibility. If FALSE, then properties
* are saved to the .mag file along with their
* type. Regardless of the setting, properties
* which are reserved keywords are converted
* to the best internal representation on input.
*/
/* ----------------------------------------------------------------------------
*
@ -57,16 +47,16 @@ bool DBPropCompat = TRUE; /* If TRUE, then always save properties to
void
DBPropPut(cellDef, name, value)
CellDef *cellDef; /* Pointer to definition of cell. */
char *name; /* The name of the property desired. */
PropertyRecord *value; /* MUST point to a malloc'ed structure, or NULL.
* This will be freed when the CellDef is freed.
*/
CellDef *cellDef; /* Pointer to definition of cell. */
char *name; /* The name of the property desired. */
ClientData value; /* MUST point to a malloc'ed structure, or NULL.
* This will be freed when the CellDef is freed.
*/
{
HashTable *htab;
HashEntry *entry;
PropertyRecord *oldvalue;
char *oldvalue;
/* Honor the NOEDIT flag. Note that the caller always assumes that */
/* the value would be saved in the hash table, so if it is not */
@ -105,23 +95,12 @@ DBPropPut(cellDef, name, value)
}
entry = HashFind(htab, name);
oldvalue = (PropertyRecord *)HashGetValue(entry);
/* All properties are allocated as a single block and can just be freed,
* except for plane properties, which require freeing the plane.
*/
if (oldvalue != NULL)
{
if (oldvalue->prop_type == PROPERTY_TYPE_PLANE)
{
DBFreePaintPlane(oldvalue->prop_value.prop_plane);
TiFreePlane(oldvalue->prop_value.prop_plane);
}
freeMagic((char *)oldvalue);
}
if (value == (PropertyRecord *)NULL)
oldvalue = (char *)HashGetValue(entry);
if (oldvalue != NULL) freeMagic(oldvalue);
if (value == (ClientData)NULL)
HashRemove(htab, name);
else
HashSetValue(entry, PTR2CD(value));
HashSetValue(entry, value);
}
/* ----------------------------------------------------------------------------
@ -131,13 +110,13 @@ DBPropPut(cellDef, name, value)
* Get a property from a celldef.
*
* Results:
* NULL if the property didn't exist, or if the property record was NULL.
* Otherwise, returns a pointer to the property record.
* NULL if the property didn't exist, or if the property value was NULL.
* Otherwise, ClientData that represents the property.
*
* ----------------------------------------------------------------------------
*/
PropertyRecord *
ClientData
DBPropGet(cellDef, name, found)
CellDef *cellDef; /* Pointer to definition of cell. */
char *name; /* The name of the property desired. */
@ -145,12 +124,12 @@ DBPropGet(cellDef, name, found)
* exists.
*/
{
PropertyRecord *result;
ClientData result;
bool haveit;
HashTable *htab;
HashEntry *entry;
result = (PropertyRecord *)NULL;
result = (ClientData) NULL;
haveit = FALSE;
htab = (HashTable *) cellDef->cd_props;
if (htab == (HashTable *) NULL) goto done;
@ -159,7 +138,7 @@ DBPropGet(cellDef, name, found)
if (entry != NULL)
{
haveit = TRUE;
result = (PropertyRecord *)HashGetValue(entry);
result = (ClientData) HashGetValue(entry);
}
done:
@ -167,109 +146,6 @@ done:
return result;
}
/* ----------------------------------------------------------------------------
*
* DBPropGetString --
*
* Get a string property from a celldef.
*
* Results:
* NULL if the property didn't exist, or if the property record was NULL.
* Otherwise, returns a pointer to the property's string record.
*
* Notes:
* This is basically the original DBPropGet(), when properties were only
* allowed to be strings.
*
* ----------------------------------------------------------------------------
*/
char *
DBPropGetString(cellDef, name, found)
CellDef *cellDef; /* Pointer to definition of cell. */
char *name; /* The name of the property desired. */
bool *found; /* If not NULL, filled in with TRUE iff the property
* exists.
*/
{
char *result = NULL;
PropertyRecord *proprec;
bool haveit;
HashTable *htab;
HashEntry *entry;
haveit = FALSE;
htab = (HashTable *) cellDef->cd_props;
if (htab == (HashTable *) NULL) goto pdone;
entry = HashLookOnly(htab, name);
if (entry != NULL)
{
proprec = (PropertyRecord *)HashGetValue(entry);
if (proprec->prop_type == PROPERTY_TYPE_STRING)
{
haveit = TRUE;
result = proprec->prop_value.prop_string;
}
}
pdone:
if (found != (bool *) NULL) *found = haveit;
return result;
}
/* ----------------------------------------------------------------------------
*
* DBPropGetDouble --
*
* Get a single double-long integer property from a celldef.
*
* Results:
* NULL if the property didn't exist, or if the property record was NULL.
* Otherwise, returns a pointer to the property's value record.
*
* ----------------------------------------------------------------------------
*/
dlong
DBPropGetDouble(cellDef, name, found)
CellDef *cellDef; /* Pointer to definition of cell. */
char *name; /* The name of the property desired. */
bool *found; /* If not NULL, filled in with TRUE iff the property
* exists.
*/
{
dlong result = 0;
PropertyRecord *proprec;
bool haveit;
HashTable *htab;
HashEntry *entry;
haveit = FALSE;
htab = (HashTable *) cellDef->cd_props;
if (htab == (HashTable *) NULL) goto ddone;
entry = HashLookOnly(htab, name);
if (entry != NULL)
{
proprec = (PropertyRecord *)HashGetValue(entry);
if (proprec->prop_type == PROPERTY_TYPE_DOUBLE)
{
haveit = TRUE;
result = proprec->prop_value.prop_double[0];
}
else if (proprec->prop_type == PROPERTY_TYPE_STRING)
{
haveit = TRUE;
sscanf(proprec->prop_value.prop_string, "%"DLONG_PREFIX"d", &result);
}
}
ddone:
if (found != (bool *) NULL) *found = haveit;
return result;
}
/* ----------------------------------------------------------------------------
*
* DBPropEnum --
@ -292,7 +168,7 @@ DBPropEnum(cellDef, func, cdata)
*
* int foo(name, value, cdata)
* char *name;
* PropertyRecord *value;
* ClientData value;
* ClientData cdata;
* {
* -- return 0 to continue,
@ -313,7 +189,7 @@ DBPropEnum(cellDef, func, cdata)
HashStartSearch(&hs);
while ((entry = HashNext(htab, &hs)) != NULL)
{
res = (*func)(entry->h_key.h_name, (PropertyRecord *)entry->h_pointer, cdata);
res = (*func)(entry->h_key.h_name, (ClientData) entry->h_pointer, cdata);
if (res != 0) return res;
}

View File

@ -895,24 +895,6 @@ DBIsContact(type)
return FALSE;
}
/*
* ----------------------------------------------------------------------------
*
* DBLayerPlanes --
*
* Like LayerPlaneMask(), except as a subroutine, not a macro. For export
* to other routines.
*
* ----------------------------------------------------------------------------
*/
PlaneMask
DBLayerPlanes(type)
TileType type;
{
return LayerPlaneMask(type);
}
/*
* ----------------------------------------------------------------------------
*

View File

@ -223,7 +223,7 @@ DBTechSetVersion(sectionName, argc, argv)
major = minor = rev = 0;
rmajor = rminor = rrev = 0;
if (sscanf(vstring, "%d.%d.%d", &rmajor, &rminor, &rrev) != 3)
if (sscanf(vstring, "%d.%d.%d", &rmajor, &rminor, &rrev) == 0)
{
TechError("Badly formed magic version string, should be major.minor.rev\n");
return FALSE;

View File

@ -327,11 +327,11 @@ DBTechNoisyNamePlane(planename)
* ----------------------------------------------------------------------------
*/
const char *
DBTypeShortName(
TileType type)
char *
DBTypeShortName(type)
TileType type;
{
const NameList *tbl;
NameList *tbl;
for (tbl = dbTypeNameLists.sn_next;
tbl != &dbTypeNameLists;
@ -347,11 +347,11 @@ DBTypeShortName(
return ("???");
}
const char *
DBPlaneShortName(
int pNum)
char *
DBPlaneShortName(pNum)
int pNum;
{
const NameList *tbl;
NameList *tbl;
for (tbl = dbPlaneNameLists.sn_next;
tbl != &dbPlaneNameLists;
@ -478,7 +478,7 @@ DBTechPrintTypes(mask, dolist)
#ifdef MAGIC_WRAPPER
Tcl_AppendResult(magicinterp, " ", (char *)NULL);
#else
TxPrintf(" ");
TxPrintf(" ", keepname);
#endif
}
}
@ -530,7 +530,7 @@ DBTechPrintTypes(mask, dolist)
#ifdef MAGIC_WRAPPER
Tcl_AppendResult(magicinterp, " ", (char *)NULL);
#else
TxPrintf(" ");
TxPrintf(" ", keepname);
#endif
}
}

View File

@ -38,14 +38,14 @@ static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/
/* Types and their names */
int DBNumTypes;
const char *DBTypeLongNameTbl[NT];
char *DBTypeLongNameTbl[NT];
int DBTypePlaneTbl[NT]; /* Normally accessed as macro "DBPlane(x)" */
NameList dbTypeNameLists = {NULL, NULL, NULL, (ClientData)0, FALSE};
HashTable DBTypeAliasTable;
/* Planes and their names */
int DBNumPlanes;
const char *DBPlaneLongNameTbl[PL_MAXTYPES];
char *DBPlaneLongNameTbl[PL_MAXTYPES];
NameList dbPlaneNameLists = {NULL, NULL, NULL, (ClientData)0, FALSE};
@ -70,28 +70,28 @@ TileTypeBitMask DBTechActiveLayerBits; /* Layers marked locked in the techfile *
/* Table of default, builtin planes */
DefaultPlane dbTechDefaultPlanes[] =
{
{PL_ROUTER, "router"},
{PL_DRC_ERROR, "designRuleError"},
{PL_DRC_CHECK, "designRuleCheck"},
{PL_M_HINT, "mhint"},
{PL_F_HINT, "fhint"},
{PL_R_HINT, "rhint"},
{0, NULL}
PL_ROUTER, "router",
PL_DRC_ERROR, "designRuleError",
PL_DRC_CHECK, "designRuleCheck",
PL_M_HINT, "mhint",
PL_F_HINT, "fhint",
PL_R_HINT, "rhint",
0, 0, 0
};
/* Table of default, builtin types */
DefaultType dbTechDefaultTypes[] =
{
{TT_SPACE, -1, "space", FALSE},
{TT_CHECKPAINT, PL_DRC_CHECK, "checkpaint,CP", FALSE},
{TT_CHECKSUBCELL, PL_DRC_CHECK, "checksubcell,CS", FALSE},
{TT_ERROR_P, PL_DRC_ERROR, "error_p,EP", FALSE},
{TT_ERROR_S, PL_DRC_ERROR, "error_s,ES", FALSE},
{TT_ERROR_PS, PL_DRC_ERROR, "error_ps,EPS", FALSE},
{TT_MAGNET, PL_M_HINT, "magnet,mag", TRUE},
{TT_FENCE, PL_F_HINT, "fence,f", TRUE},
{TT_ROTATE, PL_R_HINT, "rotate,r", TRUE},
{0, 0, NULL, 0}
TT_SPACE, -1, "space", FALSE,
TT_CHECKPAINT, PL_DRC_CHECK, "checkpaint,CP", FALSE,
TT_CHECKSUBCELL, PL_DRC_CHECK, "checksubcell,CS", FALSE,
TT_ERROR_P, PL_DRC_ERROR, "error_p,EP", FALSE,
TT_ERROR_S, PL_DRC_ERROR, "error_s,ES", FALSE,
TT_ERROR_PS, PL_DRC_ERROR, "error_ps,EPS", FALSE,
TT_MAGNET, PL_M_HINT, "magnet,mag", TRUE,
TT_FENCE, PL_F_HINT, "fence,f", TRUE,
TT_ROTATE, PL_R_HINT, "rotate,r", TRUE,
0, 0, NULL, 0
};
/* Forward declarations */
@ -116,24 +116,22 @@ NameList *dbTechNameAddOne();
*/
void
DBTechInitPlane(void)
DBTechInitPlane()
{
DefaultPlane *dpp;
const char *cp;
char *cp;
/* Clear out any old information */
if (dbPlaneNameLists.sn_next != NULL)
{
NameList *tbl;
free_magic1_t mm1 = freeMagic1_init();
for (tbl = dbPlaneNameLists.sn_next; tbl != &dbPlaneNameLists;
tbl = tbl->sn_next)
{
freeMagic(tbl->sn_name);
freeMagic1(&mm1, tbl);
freeMagic(tbl);
}
freeMagic1_end(&mm1);
}
/* Tables of short names */
@ -142,7 +140,7 @@ DBTechInitPlane(void)
for (dpp = dbTechDefaultPlanes; dpp->dp_names; dpp++)
{
cp = dbTechNameAdd(dpp->dp_names, INT2CD(dpp->dp_plane),
cp = dbTechNameAdd(dpp->dp_names, (ClientData) dpp->dp_plane,
&dbPlaneNameLists, FALSE);
if (cp == NULL)
{
@ -207,14 +205,12 @@ DBTechInitType()
{
NameList *tbl;
free_magic1_t mm1 = freeMagic1_init();
for (tbl = dbTypeNameLists.sn_next; tbl != &dbTypeNameLists;
tbl = tbl->sn_next)
{
freeMagic(tbl->sn_name);
freeMagic1(&mm1, tbl);
freeMagic(tbl);
}
freeMagic1_end(&mm1);
}
/* Tables of short names */
@ -227,7 +223,7 @@ DBTechInitType()
*/
for (dtp = dbTechDefaultTypes; dtp->dt_names; dtp++)
{
cp = dbTechNameAdd(dtp->dt_names, INT2CD(dtp->dt_type),
cp = dbTechNameAdd(dtp->dt_names, (ClientData) dtp->dt_type,
&dbTypeNameLists, FALSE);
if (cp == NULL)
{
@ -268,12 +264,12 @@ DBTechInitType()
/*ARGSUSED*/
bool
DBTechAddPlane(
const char *sectionName,
int argc,
char *argv[])
DBTechAddPlane(sectionName, argc, argv)
char *sectionName;
int argc;
char *argv[];
{
const char *cp;
char *cp;
if (DBNumPlanes >= PL_MAXTYPES)
{
@ -287,7 +283,7 @@ DBTechAddPlane(
return FALSE;
}
cp = dbTechNameAdd(argv[0], INT2CD(DBNumPlanes), &dbPlaneNameLists, FALSE);
cp = dbTechNameAdd(argv[0], (ClientData) DBNumPlanes, &dbPlaneNameLists, FALSE);
if (cp == NULL)
return FALSE;
DBPlaneLongNameTbl[DBNumPlanes++] = cp;
@ -319,7 +315,7 @@ DBTechAddNameToType(newname, ttype, canonical)
{
char *cp;
cp = dbTechNameAdd(newname, INT2CD(ttype), &dbTypeNameLists, TRUE);
cp = dbTechNameAdd(newname, (ClientData) ttype, &dbTypeNameLists, TRUE);
if (canonical)
DBTypeLongNameTbl[ttype] = cp;
}
@ -459,7 +455,7 @@ DBTechAddType(sectionName, argc, argv)
}
else
{
cp = dbTechNameAdd(argv[1], INT2CD(DBNumTypes), &dbTypeNameLists, FALSE);
cp = dbTechNameAdd(argv[1], (ClientData) DBNumTypes, &dbTypeNameLists, FALSE);
if (cp == NULL)
return FALSE;
@ -517,7 +513,7 @@ dbTechNewStackedType(type1, type2)
}
sprintf(buf, "%s+%s", DBTypeShortName(type1), DBTypeShortName(type2));
cp = dbTechNameAdd(buf, INT2CD(DBNumTypes), &dbTypeNameLists, FALSE);
cp = dbTechNameAdd(buf, (ClientData) DBNumTypes, &dbTypeNameLists, FALSE);
if (cp == NULL)
{
TechError("Couldn't generate new stacking type %s\n", buf);

Some files were not shown because too many files have changed in this diff Show More